【发布时间】:2018-08-15 07:46:27
【问题描述】:
我想将某个列(在示例 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)})
但是,我有很多专栏。是否有一种简洁优雅的解决方案可以重复整个数据框而不再次指定每一列?
【问题讨论】:
-
如果所有列都具有相同的
dtypes,我认为这是主要问题。因为如果使用df = pd.DataFrame({'column_a': [1, 2], 'column_b': ['b_1', 'b_2'], 'column_x': [['c_1', 'c_2'], ['d_1', 'd_2']] }),那么两种解决方案都会得到不同的输出 - 通过print (df1.dtypes)与print (df.dtypes)进行检查。这是主要问题 numpy 将所有 dtype 转换为相同,因此更通用的解决方案是重复index,如果所有列的相同dtypes可能也使用cᴏʟᴅsᴘᴇᴇᴅ解决方案。这取决于数据。 -
这句话很重要!非常感谢。
标签: python list pandas dataframe