将Python列表转换为数据框架(dataframe)。

3

我有一个类似以下的Python列表:

[{'date': '20200101',
  'Samsung': {'positive': 242, 'negative': 28, 'neutral': 69, 'etc': 98}},
 {'date': '20200102',
  'Samsung': {'positive': 270, 'negative': 45, 'neutral': 83, 'etc': 143}},
 {'date': '20200103',
  'Samsung': {'positive': 252, 'negative': 57, 'neutral': 90, 'etc': 113}},
 {'date': '20200104',
  'Samsung': {'positive': 292, 'negative': 57, 'neutral': 134, 'etc': 229}}]

我想要改变如下:

   target date       positive  negative neutral etc
0 Samsung 20200101   242       28       69      98
1 Samsung 20200102   270       45       33      143
2 Samsung 20200103   252       57       90      113
3 Samsung 20200104   292       74       134     229

1
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.from_dict.html - Dogukan Levendoglu
@DogukanLevendoglu,from_dict 怎么解决它? - adir abargil
@adir-abargil 对不起,你是对的。我假设他的字典符合DataFrame构造函数的标准。 - Dogukan Levendoglu
2个回答

2

这里是您的数据:

dd=[{'date': '20200101',
  'Samsung': {'positive': 242, 'negative': 28, 'neutral': 69, 'etc': 98}},
 {'date': '20200102',
  'Samsung': {'positive': 270, 'negative': 45, 'neutral': 83, 'etc': 143}},
 {'date': '20200103',
  'Samsung': {'positive': 252, 'negative': 57, 'neutral': 90, 'etc': 113}},
 {'date': '20200104',
  'Samsung': {'positive': 292, 'negative': 57, 'neutral': 134, 'etc': 229}}]


您需要更改字典结构:

new_dict=[]
for record in dd:
  for k ,v in record.items():
    if k == "date":
      new_dict.append({k:v})
    else:
      new_dict[-1].update({"target":k})
      new_dict[-1].update(v)
new_dict

这就是所得到的结果

[{'date': '20200101',
  'etc': 98,
  'negative': 28,
  'neutral': 69,
  'positive': 242,
  'target': 'Samsung'},
 {'date': '20200102',
  'etc': 143,
  'negative': 45,
  'neutral': 83,
  'positive': 270,
  'target': 'Samsung'},
 {'date': '20200103',
  'etc': 113,
  'negative': 57,
  'neutral': 90,
  'positive': 252,
  'target': 'Samsung'},
 {'date': '20200104',
  'etc': 229,
  'negative': 57,
  'neutral': 134,
  'positive': 292,
  'target': 'Samsung'}]

然后将其传递给pandas,以获得数据框架结构。


df = pd.DataFrame(new_dict)
df

       date     target  positive    negative    neutral   etc
0   20200101    Samsung     242           28       69     98
1   20200102    Samsung     270           45       83     143
2   20200103    Samsung     252           57       90     113
3   20200104    Samsung     292           57       134    229

欢迎您,如果这回答了您的问题,请随意验证。 - Pdeuxa
这应该是被接受的答案,请不要忘记接受它! - adir abargil

1
你可以做以下操作(lst是你的列表):
import pandas as pd

df=pd.DataFrame(lst)

df2=pd.json_normalize(df['Samsung'])

df['target']=[list(i.keys())[1] for i in lst]

res=pd.concat([df[['target','date']], df2], axis=1)

print(res)

输出:

    target      date  positive  negative  neutral  etc
0  Samsung  20200101       242        28       69   98
1  Samsung  20200102       270        45       83  143
2  Samsung  20200103       252        57       90  113
3  Samsung  20200104       292        57      134  229

更好了,干得好,但如果目标不仅是三星呢? - Pdeuxa
1
这只适用于特定情况,但不能解决存在另一个目标的情况。 - adir abargil
@adirabargil,感谢您的提醒,我已经调整了代码。 - IoaTzimas
仍然不太对,因为目标不是三星,所以在字典中调用“三星”是没有意义的...而且,如果顺序不如所示呢? - adir abargil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接