我想将某个列中的列表(在示例column_x中)扩展为多行。
所以
df = pd.DataFrame({'column_a': ['a_1', 'a_2'],
'column_b': ['b_1', 'b_2'],
'column_x': [['c_1', 'c_2'], ['d_1', 'd_2']]
})
应从
转换而来 column_a column_b column_x
0 a_1 b_1 [c_1, c_2]
1 a_2 b_2 [d_1, d_2]
到
column_a column_b column_x
0 a_1 b_1 c_1
1 a_1 b_1 c_2
2 a_2 b_2 d_1
3 a_2 b_2 d_2
到目前为止,我所拥有的代码就是这样做的,它是fast。
lens = [len(item) for item in df['column_x']]
pd.DataFrame( {"column_a" : np.repeat(df['column_a'].values, lens),
"column_b" : np.repeat(df['column_b'].values, lens),
"column_x" : np.concatenate(df['column_x'].values)})
但是,我有很多专栏。有没有一个整洁而优雅的解决方案来重复整个数据框而无需再次指定每一列?
答案 0 :(得分:3)
非常容易,除了 np.repeat
之外,每个列沿着0 th 轴调用column_x
。
df1 = pd.DataFrame(
df.drop('column_x', 1).values.repeat(df['column_x'].str.len(), axis=0),
columns=df.columns.difference(['column_x'])
)
df1['column_x'] = np.concatenate(df['column_x'].values)
df1
column_a column_b column_x
0 a_1 b_1 c_1
1 a_1 b_1 c_2
2 a_2 b_2 d_1
3 a_2 b_2 d_2
答案 1 :(得分:2)
您可以重复索引值:
lens = df['column_x'].str.len()
a = np.repeat(df.index.values, lens)
print (a)
[0 0 1 1]
df = df.loc[a].assign(column_x=np.concatenate(df['column_x'].values)).reset_index(drop=True)
print (df)
column_a column_b column_x
0 a_1 b_1 c_1
1 a_1 b_1 c_2
2 a_2 b_2 d_1
3 a_2 b_2 d_2