簡體   English   中英

熊貓:如何展開包含字典的數據框行,其中字典中的列具有不同的鍵?

[英]Pandas: How to expand data frame rows containing a dictionary with varying keys in a column?

我有點卡住,請你幫我一下。 我簡化了我面臨的以下問題:

輸入

在此處輸入圖片說明

期望的輸出

在此處輸入圖片說明

我知道如何處理col中的字典的情況。 c具有相同的鍵。

您可以按構造函數創建DataFrame ,按stack重塑DataFrame ,最后join原始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
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

接下來是我的解決方案:

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”是您要獲取的DataFrame。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM