熊猫:如何扩展数据框中包含不同键的字典的行?

2024-04-18 16:59:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我有点困了,你能帮我一下吗。我把我面临的问题简化为:

输入

enter image description here

期望输出

enter image description here

我知道如何处理列c中的字典具有相同键的情况。你知道吗


Tags: 字典情况
3条回答

您可以通过构造函数创建DataFrame,通过^{}重塑形状,最后^{}到原始形状:

df1 = (pd.DataFrame(df.c.values.tolist())
         .stack()
         .reset_index(level=1)
         .rename(columns={0:'val','level_1':'key'}))
print (df1)
   key  val
0  c00  v00
0  c01  v01
1  c10  v10
2  c20  v20
2  c21  v21
2  c22  v22

df = df.drop('c', 1).join(df1).reset_index(drop=True)
print (df)
    a   b  key  val
0  a0  b0  c00  v00
1  a0  b0  c01  v01
2  a1  b1  c10  v10
3  a2  b2  c20  v20
4  a2  b2  c21  v21
5  a2  b2  c22  v22

我的解决方案是:

import pandas as pd
t=pd.DataFrame([['a0','b0',{'c00':'v00','c01':'v01'}],['a1','b1',{'c10':'v10'}],['a2','b2',{'c20':'v20','c21':'v21','c22':'v22'}]],columns=['a','b','c'])
l2=[]
for i in t.index:
    for j in t.loc[i,'c']:
        l2+=[[t.loc[i,'a'],t.loc[i,'b'],j,t.loc[i,'c'][j]]]
t2=pd.DataFrame(l2,columns=['a','b','key','val'])

其中't'是您的数据帧,您可以根据需要获得它。你知道吗

有一种方法:

import pandas as pd
from itertools import chain

df = pd.DataFrame([['a0', 'b0', {'c00': 'v00', 'c01': 'v01'}],
                   ['a1', 'b1', {'c10': 'v10'}],
                   ['a2', 'b2', {'c20': 'v20', 'c21': 'v21', 'c22': 'v22'}] ],
                  columns=['a', 'b', 'c'])

# first convert 'c' to list of tuples
df['c'] = df['c'].apply(lambda x: list(x.items()))
lens = list(map(len, df['c']))

# create dataframe
df_out = pd.DataFrame({'a': np.repeat(df['a'].values, lens),
                       'b': np.repeat(df['b'].values, lens),
                       'c': list(chain.from_iterable(df['c'].values))})

# unpack tuple
df_out = df_out.join(df_out['c'].apply(pd.Series))\
               .rename(columns={0: 'key', 1: 'val'}).drop('c', 1)

#     a   b  key  val
# 0  a0  b0  c00  v00
# 1  a0  b0  c01  v01
# 2  a1  b1  c10  v10
# 3  a2  b2  c20  v20
# 4  a2  b2  c21  v21
# 5  a2  b2  c22  v22

相关问题 更多 >