Mic*_*ner 6 python list dataframe pandas
我想将某个列中的列表(在示例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']]
})
Run Code Online (Sandbox Code Playgroud)
应改变自己
column_a column_b column_x
0 a_1 b_1 [c_1, c_2]
1 a_2 b_2 [d_1, d_2]
Run Code Online (Sandbox Code Playgroud)
至
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
Run Code Online (Sandbox Code Playgroud)
到目前为止,我所拥有的代码确实如此,而且它的速度很快.
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)})
Run Code Online (Sandbox Code Playgroud)
但是,我有很多专栏.是否有一个整洁而优雅的解决方案来重复整个数据框而无需再次指定每一列?
熊猫可以通过进行单个函数调用df.explode。
df.explode('column_x')
column_a column_b column_x
0 a_1 b_1 c_1
0 a_1 b_1 c_2
1 a_2 b_2 d_1
1 a_2 b_2 d_2
Run Code Online (Sandbox Code Playgroud)
请注意,只能在一个列上爆炸Series / DataFrame。
呼叫np.repeat沿0 次,每列轴之外 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
Run Code Online (Sandbox Code Playgroud)
您可以重复索引值:
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
910 次 |
| 最近记录: |