我有DataFrame df
:
a b c
0 7 5 [[-4, 7], [-5, 6]]
1 13 5 [[-9, 4], [-3, 7]]
我想将带有列表单元格列表(列“ c”)的列展平到单独的DataFrame中,这样:
我设法在下面获得期望的结果(我知道有int
到float
的转换,但这对我来说并不麻烦):
a b d e
0 7 5 -4.0 7.0
1 7 5 -5.0 6.0
2 13 5 -9.0 4.0
3 13 5 -3.0 7.0
但是,我认为这样做的方法并不理想,因为它首先使用大量代码,其次使用iterrows()
。
下面是我的代码:
old_cols = list(df)
old_cols.remove('c')
new_cols = ['d', 'e']
all_cols = old_cols + new_cols
df_flat = pd.DataFrame(columns=all_cols)
for idx, row in df.iterrows():
data = row['c']
for entry in data:
temp_series = pd.Series(index=new_cols)
temp_series['d'] = entry[0]
temp_series['e'] = entry[1]
new_row = pd.concat([row[old_cols], temp_series])
df_flat = df_flat.append(new_row, ignore_index=True)
答案 0 :(得分:3)
将groupby
+ apply
与pd.DataFrame
结合使用:
df = df.groupby(['a','b'])\
.apply(lambda x: pd.DataFrame(x['c'].tolist()[0], columns=['c','d']))\
.reset_index([0,1]).reset_index(drop=True)
print(df)
a b c d
0 7 5 -4 7
1 7 5 -5 6
2 13 5 -9 4
3 13 5 -3 7
说明:
因为列c
中的每个值都是列表列表。为了简化它们并使它们成为不同的列,我们采用x['c'].tolist()
,其中包含2个没有用的开括号([[[values],[values]]]
),因此x['c'].tolist()[0]
给出[[values],[values]]
用作数据存储到pd.DataFrame
列{{1}上的['c','d']
列和最终reset_index
列levels = [0,1]
中。{p>
['a','b']