更快的解决方案,以获取字典列表中的值并在 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)

希望能找到比上述解决方案运行速度更快的解决方案。提前谢谢你。

尝试explodeassign

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,请不要删除该专栏。