Pandas 透视数据帧上的 cumsum
Pandas cumsum on pivoted dataframe
我有一个表格的旋转数据框。
Quantity Result
Alpha A B C A B C
Order
1 3.0 0.0 0.0 Best None None
2 0.0 6.0 4.0 None Good Good
3 3.0 0.0 0.0 Average None None
我正在尝试创建另一个名为 CumulativeQty 的主要列,其中包含 3 列,我想将其作为主要列 Quantity 中相应 3 列的 cumsum()。如果不单独指定次要列,我将如何处理?我试过了
p['CumulativeQty'] = p['Quantity'].cumsum(axis=1)
但这会抱怨 ValueError:通过 3 的项目数量错误,放置意味着 1。
想要的结果是
CumulativeQty
Alpha A B C
Order
1 3.0 0.0 0.0
2 3.0 6.0 4.0
3 6.0 6.0 4.0
下面是如何获取起始旋转数据框。
df = pd.DataFrame(data=[[1, "A", 3, "Best"], [2, "C", 4, "Good"], [2, "B", 6, "Good"], [3, "A", 3, "Average"]],
columns=["Order", "Alpha", "Quantity", "Result"])
p = df.pivot(index="Order", columns="Alpha")
p['Quantity'] = p['Quantity'].fillna(0)
选项 1
p.join(p[['Quantity']].cumsum().rename(columns=dict(Quantity='Cumsum')))
Quantity Result Cumsum
Alpha A B C A B C A B C
Order
1 3.0 0.0 0.0 Best None None 3.0 0.0 0.0
2 0.0 6.0 4.0 None Good Good 3.0 6.0 4.0
3 3.0 0.0 0.0 Average None None 6.0 6.0 4.0
选项 2
pd.concat([
p.Quantity, p.Result, p.Quantity.cumsum()
], axis=1, keys=['Quantity', 'Result', 'Cumsum'])
Quantity Result Cumsum
Alpha A B C A B C A B C
Order
1 3.0 0.0 0.0 Best None None 3.0 0.0 0.0
2 0.0 6.0 4.0 None Good Good 3.0 6.0 4.0
3 3.0 0.0 0.0 Average None None 6.0 6.0 4.0
一种方法是:
for i in sorted(df.Alpha):
p['CumulativeQty',i] = p['Quantity',i].cumsum(axis=0)
请注意,我将 axis=1
更改为 axis=0
,因为您进行的是水平求和,因此您未获得所需的输出。
输出:
Quantity Result CumulativeQty
Alpha A B C A B C A B C
Order
1 3.0 0.0 0.0 Best None None 3.0 0.0 0.0
2 0.0 6.0 4.0 None Good Good 3.0 6.0 4.0
3 3.0 0.0 0.0 Average None None 6.0 6.0 4.0
您的问题基本上是您试图将所有 A B and C
结果放入一列中。所以这基本上是一个 "MultiIndex" 问题。
我有一个表格的旋转数据框。
Quantity Result
Alpha A B C A B C
Order
1 3.0 0.0 0.0 Best None None
2 0.0 6.0 4.0 None Good Good
3 3.0 0.0 0.0 Average None None
我正在尝试创建另一个名为 CumulativeQty 的主要列,其中包含 3 列,我想将其作为主要列 Quantity 中相应 3 列的 cumsum()。如果不单独指定次要列,我将如何处理?我试过了
p['CumulativeQty'] = p['Quantity'].cumsum(axis=1)
但这会抱怨 ValueError:通过 3 的项目数量错误,放置意味着 1。
想要的结果是
CumulativeQty
Alpha A B C
Order
1 3.0 0.0 0.0
2 3.0 6.0 4.0
3 6.0 6.0 4.0
下面是如何获取起始旋转数据框。
df = pd.DataFrame(data=[[1, "A", 3, "Best"], [2, "C", 4, "Good"], [2, "B", 6, "Good"], [3, "A", 3, "Average"]],
columns=["Order", "Alpha", "Quantity", "Result"])
p = df.pivot(index="Order", columns="Alpha")
p['Quantity'] = p['Quantity'].fillna(0)
选项 1
p.join(p[['Quantity']].cumsum().rename(columns=dict(Quantity='Cumsum')))
Quantity Result Cumsum
Alpha A B C A B C A B C
Order
1 3.0 0.0 0.0 Best None None 3.0 0.0 0.0
2 0.0 6.0 4.0 None Good Good 3.0 6.0 4.0
3 3.0 0.0 0.0 Average None None 6.0 6.0 4.0
选项 2
pd.concat([
p.Quantity, p.Result, p.Quantity.cumsum()
], axis=1, keys=['Quantity', 'Result', 'Cumsum'])
Quantity Result Cumsum
Alpha A B C A B C A B C
Order
1 3.0 0.0 0.0 Best None None 3.0 0.0 0.0
2 0.0 6.0 4.0 None Good Good 3.0 6.0 4.0
3 3.0 0.0 0.0 Average None None 6.0 6.0 4.0
一种方法是:
for i in sorted(df.Alpha):
p['CumulativeQty',i] = p['Quantity',i].cumsum(axis=0)
请注意,我将 axis=1
更改为 axis=0
,因为您进行的是水平求和,因此您未获得所需的输出。
输出:
Quantity Result CumulativeQty
Alpha A B C A B C A B C
Order
1 3.0 0.0 0.0 Best None None 3.0 0.0 0.0
2 0.0 6.0 4.0 None Good Good 3.0 6.0 4.0
3 3.0 0.0 0.0 Average None None 6.0 6.0 4.0
您的问题基本上是您试图将所有 A B and C
结果放入一列中。所以这基本上是一个 "MultiIndex" 问题。