我有一个数据框,其中一些单元格包含多个值的列表。而不是存储多个 在单元格中,我希望扩展数据框,以便列表中的每个项都有自己的行(在所有其他列中都有相同的值)。因此,如果我有:
import pandas as pd
import numpy as np
df = pd.DataFrame(
{'trial_num': [1, 2, 3, 1, 2, 3],
'subject': [1, 1, 1, 2, 2, 2],
'samples': [list(np.random.randn(3).round(2)) for i in range(6)]
}
)
df
Out[10]:
samples subject trial_num
0 [0.57, -0.83, 1.44] 1 1
1 [-0.01, 1.13, 0.36] 1 2
2 [1.18, -1.46, -0.94] 1 3
3 [-0.08, -4.22, -2.05] 2 1
4 [0.72, 0.79, 0.53] 2 2
5 [0.4, -0.32, -0.13] 2 3
如何转换为长格式,例如:
subject trial_num sample sample_num
0 1 1 0.57 0
1 1 1 -0.83 1
2 1 1 1.44 2
3 1 2 -0.01 0
4 1 2 1.13 1
5 1 2 0.36 2
6 1 3 1.18 0
# etc.
索引不重要,可以设置现有索引 列作为索引,而最终排序不是 重要的
比我预期的要长一点:
如果需要顺序索引,可以对结果应用
reset_index(drop=True)
更新:
更新:下面的解决方案对较旧的Pandas版本很有帮助,因为DataFrame.explode()不可用。从Pandas 0.25.0开始,您可以简单地使用
DataFrame.explode()
结果:
PShere you may find a bit more generic solution
更新:一些解释:理解此代码最简单的方法是尝试一步一步地执行它:
在下一行中,我们将一列中的值重复
N
次,其中N
-是对应列表的长度:这可以推广到所有包含标量值的列:
使用
np.concatenate()
我们可以展平list
列(samples
)中的所有值并获得1D向量:综上所述:
使用
pd.DataFrame()[df.columns]
将保证我们按原始顺序选择列熊猫>;=0.25
Series和DataFrame方法定义了一个^{} 方法,该方法将列表分解为单独的行。请参阅Exploding a list-like column的文档部分
请注意,这还可以适当地处理列表和标量的混合列以及空列表和NAN(这是基于
repeat
的解决方案的一个缺点)但是,您应该注意到,
explode
只对单个列起作用(目前)注意:如果您希望分解一列字符串,则需要先在分隔符上拆分,然后使用
explode
。看到这个(非常)related answer by me.相关问题 更多 >
编程相关推荐