如何在 python 熊猫中展平数据帧(可能类似于将单位矩阵转换为 1 向量)



>我有以下数据

df = pd.DataFrame(
{
'L': ['a',  'a',  'a',  'b',  'b',  'b',  'b'],
'P': ['p1', 'p2', 'p3', 'p4', 'p2', 'p1', 'p5'],
'V': [8   , 12  , 13  ,  77 ,  22 ,  3  ,  11],
}
)
df = df.join( pd.get_dummies(df['P'] ).mul(df['V'], axis=0))

打印为:

In [71]: df
Out[71]:
L   P   V  p1  p2  p3  p4  p5
0  a  p1   8   8   0   0   0   0
1  a  p2  12   0  12   0   0   0
2  a  p3  13   0   0  13   0   0
3  b  p4  77   0   0   0  77   0
4  b  p2  22   0  22   0   0   0
5  b  p1   3   3   0   0   0   0
6  b  p5  11   0   0   0   0  11

我想做的是,使用熊猫,将其转换为以下内容:

L  p1  p2  p3  p4  p5
a   8  12  13   0   0
b   3  22   0  77  11

我不确定"扁平化"是否是正确的词

编辑

如果能解释为什么这过于宽泛,将不胜感激,因为这似乎是一个相当具体的例子。

您的解决方案应随get_dummies更改,并按列df['L']sum聚合:

df = pd.get_dummies(df['P']).mul(df['V'], axis=0).groupby(df['L']).sum().reset_index()
print (df)
L  p1  p2  p3  p4  p5
0  a   8  12  13   0   0
1  b   3  22   0  77  11

另一种方法是使用DataFrame.pivot_table

df1 = (df.pivot_table(index='L', columns='P', values='V', aggfunc='sum', fill_value=0)
.reset_index()
.rename_axis(None, axis=1))
print (df1)
L  p1  p2  p3  p4  p5
0  a   8  12  13   0   0
1  b   3  22   0  77  11

我不知道它好不好,但它有效:

In [3]: df.set_index(['L', 'P']).unstack().fillna(0)                                                                                                                      
Out[3]: 
V                        
P   p1    p2    p3    p4    p5
L                             
a  8.0  12.0  13.0     0     0
b  3.0  22.0     0  77.0  11.0

最新更新