首页 > 解决方案 > 如何将存储在熊猫数据框单元格中的 JSON 对象的键值连接成每行的字符串?

问题描述

我的问题是:

如何将存储在熊猫数据框单元格中的 JSON 对象的键值连接成每行的字符串?对不起,我觉得我的问题很简单,但我找不到一个好的表达方式。

我的背景是:

假设我有一个 pandas 数据框 df,其中包含一个名为“participants”的列。单元格值是 JSON 对象,例如:

df['participants'][0] == df.participants[0] ==

[{'participantId': 1,
  'championId': 7 },
 {'participantId': 2,
  'championId': 350 },
 {'participantId': 3,
  'championId': 266 },
 {'participantId': 4,
  'championId': 517 },
 {'participantId': 5,
  'championId': 110, },
...
...
{'participantId': 10,
'championId': 10 }]

df.participants[1]将包含完全不同的信息,具有相同的结构。如果有人感兴趣,这是英雄联盟 RiotWatcher python API 为每场比赛数据吐出的部分内容。

我的目标是,对于 each participantId,将其连接成 df 中每行的单个字符串,这样我们就有一个新列“x”,其中包含每行的字符串 '7, 350, 266, 517, 110',具体取决于参与者列中的内容。

我的工作解决方案是:

for i in range(0, 20): #range of however many rows we have in dataframe, assume 20
    y = ''
    for j in range(0, 10): #there are always ten participants
        this_champion_id = str(df_d1['participants'][i][j].get('championId'))
        y += ' '+this_champion_id
    df_d1['x'] = y

旁注:我避免使用列表,因为我读过列表在熊猫中没有矢量化,这意味着它们更慢。这就是我在这里使用字符串的原因。)

但是,由于我的数据大约有 100k 行,这感觉它不是最快的解决方案,特别是因为我认为嵌套的 for 循环更慢,对吧?

有没有可能做类似的事情

df['x'] = [str(df_d1['participants'][key][value].get('championId') for key, value in df['participants']]?

我正在考虑使用单个 for 循环的方法是利用 json 库,例如:

for i in range(0, 20):
    x = str(pd.json_normalize(df_d1.participants[i])['championId'].values)
    df['x'] = x

有没有人遇到过类似的事情?您是否找到了解决此问题的无痛方法?我的解决方案需要一些时间来运行。

谢谢!

标签: pythonjsonpandasdataframe

解决方案


In [16]: df['x'] = df['participants'].map(lambda x: ', '.join(str(i['participantId']) for i in x))
    ...: print(df['participants'][0])
    ...: print(df['x'][0])
    ...:
[{'participantId': 1, 'championId': 7}, {'participantId': 2, 'championId': 350}, {'participantId': 3, 'championId': 266}]
1, 2, 3

推荐阅读