【问题标题】:Most efficient way to convert a Series of dicts to a DataFrame [duplicate]将一系列dicts转换为DataFrame的最有效方法[重复]
【发布时间】:2020-07-22 04:40:07
【问题描述】:

给定以下形式的数据:

ydata = [{'a': 1, 'b': 2}, {'a': 3, 'd': 4}, None]
yindex = [50, 51, 52]
y = pd.Series(ydata, name='y', index=pd.Index(yindex, name='i'))

将这个 y 系列转换为如下所示的 DataFrame 的最有效,甚至是最惯用/首选的方法是什么?

      a    b    d
i                
50  1.0  2.0  NaN
51  3.0  NaN  4.0
52  NaN  NaN  NaN

一个天真的解决方案是:

pd.DataFrame([rec if rec else {} for rec in y.tolist()],
             index=y.index)

【问题讨论】:

  • df=pd.DataFrame(ydata, index=yindex) 应该可以解决问题
  • @BryceWayne 我只是在构建y 以进行演示。数据已经从 DataFrame 的列中传给我了。
  • 我想你的解决方案在这里应该是不错的方法。
  • 试试pd.DataFrame(y.to_dict()).T PS如果你有重复的索引,这将失败。

标签: python pandas


【解决方案1】:

使用pd.concat:

df = pd.concat([pd.DataFrame(v, index=[i]) for i,v in y.iteritems()])
print(df)
      a    b    d
50  1.0  2.0  NaN
51  3.0  NaN  4.0
52  NaN  NaN  NaN

d = y[y.notna()]
df = pd.DataFrame(d.tolist(), index=d.index).reindex(y.index)

【讨论】:

  • 这看起来不错,因为它使用了很多 Pandas 功能。但是,至少在小型玩具数据上,它似乎比我天真的列表理解要慢得多。不确定性能如何扩展到更多的行。让我们看看是否还有其他有趣的答案。
  • @shadowtalker 我认为重复的答案y.apply(pd.Series) 适合你。有兴趣知道哪个效果更快。
  • 我最终选择了我原来的解决方案,因为它似乎比两者都快得多。
猜你喜欢
  • 2013-03-05
  • 2023-04-06
  • 1970-01-01
  • 2015-08-08
  • 1970-01-01
  • 2016-05-25
  • 2013-04-15
  • 2014-12-31
  • 1970-01-01
相关资源
最近更新 更多