更快的解决方案,以获取字典列表中的值并在 pandas 数据框中添加行以进行多个字典的观察
Faster solution to get values in list of dictionaries and add row in pandas dataframe for observations with multiple dictionaries
我有一个使用 Tweepy 抓取的数据框,如下所示:
index user entities.user.mentions
1 w [{'screen_name': 'a','name': '1'},{'screen_name': 'b','name': '2',}]
2 x [{'screen_name': 'c','name': '3'}]
3 y [{'screen_name': 'e','name': '5'},{'screen_name': 'f','name': '6',}]
4 z [{'screen_name': 'g','name': '7'}]
我想创建一个具有键值 'screen_name' 的列。如果 'entities.user.mentions' 中连续有多个词典,我想在相应的 'screenname' 旁边创建另一行具有相同 'user' 的行。这就是我希望新数据框的样子:
index user mention
1 w a
2 w b
3 x c
4 y e
5 y f
6 z g
我能够使用以下 for 循环来完成它,但是它花费的时间(5 分钟)比我想要的要长得多 运行:
for x in range(len(df['entities.user.mentions'])):
d1 = {}
for y in range(len(df['emu'][x])):
d1[y] = df['entities.user.mentions'][x][y]['screen_name']
df['entities.user.mentions'][x] = d1
然后:
final_df = pd.DataFrame()
for x in range(len(df)):
for y in range(len(df['emu_sn'][x])):
a = df.iloc[x,]
a['entities.user.mentions'] = df['entities.user.mentions'][x][y]
final_df = final_df.append(a)
希望能找到比上述解决方案运行速度更快的解决方案。提前谢谢你。
尝试explode
和assign
df_final = (df.explode('entities.user.mentions')
.assign(mention=lambda x: x['entities.user.mentions'].str['screen_name'])
.drop('entities.user.mentions',1))
Out[141]:
index user mention
0 1 w a
0 1 w b
1 2 x c
2 3 y e
2 3 y f
3 4 z g
使用 pandas.DataFrame.explode
,您可以在 4 行中完成此操作。
new_df = df.explode('entities.user.mentions')
new_df['mention'] = new_df['entities.user.mentions'].apply(lambda x: x.get('screen_name'))
new_df.drop('entities.user.mentions', axis=1, inplace=True)
print (new_df)
您的输出将如下所示:
user mention
0 w a
0 w b
1 x c
2 y e
2 y f
3 z g
如果您想保留 entities.user.mentions
,请不要删除该专栏。
我有一个使用 Tweepy 抓取的数据框,如下所示:
index user entities.user.mentions
1 w [{'screen_name': 'a','name': '1'},{'screen_name': 'b','name': '2',}]
2 x [{'screen_name': 'c','name': '3'}]
3 y [{'screen_name': 'e','name': '5'},{'screen_name': 'f','name': '6',}]
4 z [{'screen_name': 'g','name': '7'}]
我想创建一个具有键值 'screen_name' 的列。如果 'entities.user.mentions' 中连续有多个词典,我想在相应的 'screenname' 旁边创建另一行具有相同 'user' 的行。这就是我希望新数据框的样子:
index user mention
1 w a
2 w b
3 x c
4 y e
5 y f
6 z g
我能够使用以下 for 循环来完成它,但是它花费的时间(5 分钟)比我想要的要长得多 运行:
for x in range(len(df['entities.user.mentions'])):
d1 = {}
for y in range(len(df['emu'][x])):
d1[y] = df['entities.user.mentions'][x][y]['screen_name']
df['entities.user.mentions'][x] = d1
然后:
final_df = pd.DataFrame()
for x in range(len(df)):
for y in range(len(df['emu_sn'][x])):
a = df.iloc[x,]
a['entities.user.mentions'] = df['entities.user.mentions'][x][y]
final_df = final_df.append(a)
希望能找到比上述解决方案运行速度更快的解决方案。提前谢谢你。
尝试explode
和assign
df_final = (df.explode('entities.user.mentions')
.assign(mention=lambda x: x['entities.user.mentions'].str['screen_name'])
.drop('entities.user.mentions',1))
Out[141]:
index user mention
0 1 w a
0 1 w b
1 2 x c
2 3 y e
2 3 y f
3 4 z g
使用 pandas.DataFrame.explode
,您可以在 4 行中完成此操作。
new_df = df.explode('entities.user.mentions')
new_df['mention'] = new_df['entities.user.mentions'].apply(lambda x: x.get('screen_name'))
new_df.drop('entities.user.mentions', axis=1, inplace=True)
print (new_df)
您的输出将如下所示:
user mention
0 w a
0 w b
1 x c
2 y e
2 y f
3 z g
如果您想保留 entities.user.mentions
,请不要删除该专栏。