Python 熔化包含字典列的数据帧,以便字典值也熔化 这不是复制品

Python 熔化包含字典列的数据帧,以便字典值也熔化 这不是复制品,python,pandas,merge,data-manipulation,json-normalize,Python,Pandas,Merge,Data Manipulation,Json Normalize,此问题:不回答此帖子中的问题。在这篇文章的末尾,我介绍了一种将一列字典转换为数据帧的方法,这并不是我在这里发现的困难 安装程序 鉴于以下数据: d1={'a':12,'b':44} d2={'this':9'that':33'there':82} d3={'x':19,'y':38,'z':12,'t':90} df=pd.数据帧(dict( var_1=[1,2,3], 变量2=['1','2','4'], var_3=[d1、d2、d3] )) 看起来是: var_1 var_2 var

此问题:不回答此帖子中的问题。在这篇文章的末尾,我介绍了一种将一列字典转换为数据帧的方法,这并不是我在这里发现的困难


安装程序 鉴于以下数据:

d1={'a':12,'b':44}
d2={'this':9'that':33'there':82}
d3={'x':19,'y':38,'z':12,'t':90}
df=pd.数据帧(dict(
var_1=[1,2,3],
变量2=['1','2','4'],
var_3=[d1、d2、d3]
))
看起来是:

var_1 var_2 var_3
01一{'a':12,'b':44}
12两个{'this':9'that':33'there':82}
2 3四个{'x':19,'y':38,'z':12,'t':90}
我希望能够以一种 还从
var_3
列中提取了词典

仅使用第一行:

   var_1 var_2                                 var_3
0      1   one                    {'a': 12, 'b': 44}
预期的中期结果将是:

   var_1 var_2   key   value    
0      1   one    a     12
1      1   one    b     44

熔化后,这将是:

# using df.melt(id_vars = ['var_1', 'var_2'])

   var_1 var_2 variable value
0      1   one      key     a
1      1   one      key     b
2      1   one    value    12
3      1   one    value    44
我希望在所有数据中都这样做

企图 老实说,我不知道该怎么做

#生成键:值数据帧
第i行=0
col_i=2
key\u value\u df=(pd.DataFrame(df.iloc[row\u i,col\u i],index=[0])
.T.重置索引()
.rename(列={'index':'key',0:'value'})
)
data_thing=(pd.concat([pd.DataFrame(df.iloc[0,0,1]))
.to_dict(),index=[0])]*len(key_value_df)))
然后

data\u thing.join(key\u value\u df).重置索引(drop=True)
将给予

var_1 var_2键值
0 1 1 a 12
1 1 a 12
但这感觉它可以得到极大的改进,我不确定是否可以推广到其他行

编辑 我可以使用以下内容获取一列字典作为数据帧

all_keys=functools.reduce(lambda x,y:x+y,[list(x.keys())表示var3中的x])
all_values=functools.reduce(lambda x,y:x+y,[list(x.values())表示var3中的x])
数据帧(dict(键=所有键,值=所有值))
给予

    keys  values
0      a      12
1      b      44
2   this       9
3   that      33
4  there      82
5      x      19
6      y      38
7      z      12
8      t      90
但这并没有回答我提出的问题

def custom_melt(df):
    vals = []
    for row in df.itertuples():
        for k, v in row.var_3.items():
            vals.append({'var_1': row.var_1,
                         'var_2': row.var_2,
                         'variable': 'key',
                         'value': k})
            vals.append({'var_1': row.var_1,
                         'var_2': row.var_2,
                         'variable': 'value',
                         'value': v})
    return pd.DataFrame(vals).sort_values(['var_1', 'var_2', 'variable'])
输出

>>>custom_melt(df)
    var_1 var_2 variable  value
0       1   one      key      a
2       1   one      key      b
1       1   one    value     12
3       1   one    value     44
使用您的
df
将熊猫作为pd导入
var3=pd.DataFrame(pd.DataFrame(df['var_3'].values.tolist()).stack().reset_index(level=1))
var3.columns=['keys','values']
打印(var3)
关键值
0 a 12.0
0 b 44.0
1这是9.0
1这是33.0
1有82.0
2x19.0
2 y 38.0
2Z12.0
2T90.0
df=df.join(var3)
打印(df)

pd.json\u规范化
  • 这可能更好
var3=pd.DataFrame(pd.json_normalize(df.var_3.stack()).reset_index(level=1)
var3.columns=['keys','values']

使用嵌套for循环和硬编码列名让我有点不安谢谢Trenton,我刚刚意识到这是有效的,因为索引值被保留了,使连接可以在以后使用它。我几乎从来没有这样做过,所以这对我来说是非常有益的。干杯:)(起初我很惊讶join知道每个人要保留多少ha…)是的,这是一个问题。每个人都想要一个好的
0…n
索引,但是你不能
加入