Циклические текстовые данные на основе значения столбца во фрейме данных в python

#python #pandas #dataframe #nlp

Вопрос:

У меня есть набор данных под названием data_set_tweets.csv, как показано ниже

created_at,твит,количество
ретвитов 7/29/2021 2:40,Отличный солнечный день для крикета в Лондоне,3
7/29/2021 10:40,Отличный результат, набранный Англией,0
7/29/2021 11:50,Англия выиграла матч,1

И то, что я пытался сделать, — это ввести нижеприведенный вывод в фрейм данных.
Это означает, что я хочу повторить текст в столбце твита на основе значения retweet_count с теми же значениями created_at в этом конкретном твите
Ниже приведен ожидаемый результат для моего набора данных

created_at,Твиттер
7/29/2021 2:40,отличный солнечный день для игры в крикет в Лондоне
7/29/2021 2:40,отличный солнечный день для игры в крикет в Лондоне
7/29/2021 2:40,отличный солнечный день для игры в крикет в Лондоне
7/29/2021 2:40,отличный солнечный день для игры в крикет в Лондоне
7/29/2021 10:40,отличный результат поставить на Англию ватин
7/29/2021 11:50,Англия выиграла матч
7/29/2021 11:50,Англия выиграла матч

Ниже показано, как я начал свой подход

 import pandas as pd

def iterateTweets():
tweets = pd.read_csv(r'data_set_tweets.csv')
df = pd.DataFrame(tweets, columns=['created_at', 'tweet', 'retweet_count'])
df['created_at'] = pd.to_datetime(df['created_at'])
df['tweet'] = df['tweet'].apply(lambda x: str(x))
df['retweet_count'] = df['retweet_count'].apply(lambda x: str(x))

# print(df)
return df

if __name__ == '__main__':

print(iterateTweets())
 

Я новичок в фреймах данных и python, может ли кто-нибудь мне помочь?

Ответ №1:

Используйте Index.repeat с DataFrame.loc для дублированных столбцов, DataFrame.pop предназначен для использования и удаления столбца:

 df = pd.read_csv(r'data_set_tweets.csv')

df['created_at'] = pd.to_datetime(df['created_at'])
df = df.loc[df.index.repeat(df.pop('retweet_count')   1)].reset_index(drop=True)
print (df)
           created_at                                  tweet
0 2021-07-29 02:40:00  Great Sunny day for Cricket at London
1 2021-07-29 02:40:00  Great Sunny day for Cricket at London
2 2021-07-29 02:40:00  Great Sunny day for Cricket at London
3 2021-07-29 02:40:00  Great Sunny day for Cricket at London
4 2021-07-29 10:40:00  Great Score put on by England batting
5 2021-07-29 11:50:00                  England won the match
6 2021-07-29 11:50:00                  England won the match
 

Ответ №2:

Или использовать:

 df = df.apply(lambda x: x.repeat(df['retweet_count']   1)).reset_index(drop=True)
 

Если вы хотите удалить retweet_count столбец:

 df = df.apply(lambda x: x.repeat(df['retweet_count']   1)).reset_index(drop=True).drop('retweet_count', axis=1)
 

Или:

 col = df.pop('retweet_count')   1
df = df.apply(lambda x: x.repeat(col)).reset_index(drop=True)
 

df выход:

            created_at                                  tweet
0 2021-07-29 02:40:00  Great Sunny day for Cricket at London
1 2021-07-29 02:40:00  Great Sunny day for Cricket at London
2 2021-07-29 02:40:00  Great Sunny day for Cricket at London
3 2021-07-29 02:40:00  Great Sunny day for Cricket at London
4 2021-07-29 10:40:00  Great Score put on by England batting
5 2021-07-29 11:50:00                  England won the match
6 2021-07-29 11:50:00                  England won the match
 

Или использовать loc с enumerate :

 df.loc[sum([[i] * (v   1) for i, v in enumerate(df['retweet_count'])], [])].reset_index(drop=True)