【问题标题】:unpack dictionary entries in pandas into dataframe将 pandas 中的字典条目解压缩到数据框中
【发布时间】:2017-05-04 11:00:44
【问题描述】:

我有一个数据框,其中一列中有一个字典

import pandas as pd
import numpy as np

def generate_dict():
    return {'var1': np.random.rand(), 'var2': np.random.rand()}

data = {}
data[0] = {}
data[1] = {}
data[0]['A'] = generate_dict()
data[1]['A'] = generate_dict()

df = pd.DataFrame.from_dict(data, orient='index')

我想将字典中的键/值对解压缩到一个新的数据框中,其中每个条目都有自己的行。我可以通过遍历行并附加到新的 DataFrame 来做到这一点:

def expand_row(row):
    df_t = pd.DataFrame.from_dict({'value': row.A})
    df_t.index.rename('row', inplace=True)
    df_t.reset_index(inplace=True)
    df_t['column'] = 'A'
    return df_t

df_expanded = pd.DataFrame([])
for _, row in df.iterrows():
    T = expand_row(row)
    df_expanded = df_expanded.append(T, ignore_index=True)

这相当慢,而且我的应用程序对性能至关重要。我认为df.apply 可以做到这一点。然而,当我的函数返回一个 DataFrame 而不是一个系列时,只需做

df_expanded = df.apply(expand_row)

不太好用。执行此操作的最有效方法是什么?

提前致谢。

【问题讨论】:

    标签: python pandas dictionary


    【解决方案1】:

    您可以使用嵌套列表推导,然后将列 0 替换为常量 A(列名):

    d = df.A.to_dict()
    
    df1 = pd.DataFrame([(key,key1,val1) for key,val in d.items() for key1,val1 in val.items()])
    df1[0] = 'A'
    df1.columns = ['columns','row','value']
    print (df1)
      columns   row     value
    0       A  var1  0.013872
    1       A  var2  0.192230
    2       A  var1  0.176413
    3       A  var2  0.253600
    

    另一种解决方案:

    df1 = pd.DataFrame.from_records(df.A.values.tolist()).stack().reset_index()
    df1['level_0'] = 'A'
    df1.columns = ['columns','row','value']
    print (df1)
      columns   row     value
    0       A  var1  0.332594
    1       A  var2  0.118967
    2       A  var1  0.374482
    3       A  var2  0.263910
    

    【讨论】:

      猜你喜欢
      • 2021-07-10
      • 2013-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-12
      • 1970-01-01
      • 2021-09-27
      相关资源
      最近更新 更多