>我有以下数据
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