【问题标题】:Convert Python list to dataframe将 Python 列表转换为数据框
【发布时间】:2021-04-19 06:27:11
【问题描述】:

我有一个 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

【问题讨论】:

标签: python dataframe dictionary


【解决方案1】:

这是您的数据:

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

【讨论】:

  • 不客气,请随时验证它是否回答了您的问题。
  • 这应该是公认的答案,别忘了接受!
【解决方案2】:

您可以执行以下操作(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

【讨论】:

  • 更好,干得好,但如果目标不仅仅是三星呢?
  • 这只是解决这个特定的情况,但不能解决有另一个目标的情况..
  • @adirabargil 感谢您的通知,我调整了代码
  • 它似乎仍然不正确,因为目标不是三星,在字典上调用“三星”毫无意义,因为它不存在......而且,如果订单不显示怎么办?
猜你喜欢
  • 2016-02-05
  • 2021-04-12
  • 1970-01-01
  • 2020-05-07
  • 1970-01-01
  • 2020-07-23
  • 2013-01-27
  • 2020-10-22
  • 2021-09-27
相关资源
最近更新 更多