使用列名的部分能否重塑 Pandas DataFrame?

3

我刚开始使用pandas和数据框架工作。我想重新整理一些数据,但不确定最佳方法。我的直觉是遍历数据框架,但我希望有更好的方法。

因此,我有一个初始数据框架,看起来像这样:

供应商所在州 客户所在州 日期 购买总量A 购买总量B
加利福尼亚州 华盛顿州 2021年2月1日 10 5
加利福尼亚州 俄勒冈州 2021年2月1日 8 7
纽约州 新泽西州 2021年3月7日 15 9
纽约州 新泽西州 2021年2月8日 7 25
纽约州 纽约州 2021年2月8日 24 3

我想把它转换成以下形式:

供应商所在州 客户所在州 小部件类型 2021-02-01 2021-02-08 2021-03-07
加利福尼亚州 华盛顿州 widget_a 10 0 0
加利福尼亚州 华盛顿州 widget_b 5 0 0
纽约州 新泽西州 widget_a 0 7 15
纽约州 新泽西州 widget_b 0 25 9
纽约州 纽约州 widget_a 0 24 0
纽约州 纽约州 widget_b 0 3 0

这里有两个问题我遇到了困难。

  • 是否有一种方法可以从原始列名中收集widget_a和widget_b并将其放在结果的widget类型列中?
  • 是否有一个好的操作方法最终得到我想要的列?对我来说,感觉某种透视会起作用,但是这通常会以类似于以下列的形式结束
CA/WA/2021-02-01 CA/WA/2021-02-08 CA/WA/2021-03-07

我希望我只是因为之前没有使用过pandas而错过了一些基本的东西。

1个回答

4

通过 stack unstack:

df = (df.set_index(['vendor_state','client_state','date'])
 .stack()
 .unstack(2)
 .reset_index()
 .rename(columns={'level_2': 'widget type'})
 .fillna(0)
 )
df['widget type'] = df['widget type'].str.extract(pat = ("(widget_[a|b])"))

输出结果:

供应商所在州 客户所在州 小部件类型 2021-02-01 2021-02-08 2021-03-07
0 加利福尼亚州 俄勒冈州 小部件A 8.0 0.0 0.0
1 加利福尼亚州 俄勒冈州 小部件B 7.0 0.0 0.0
2 加利福尼亚州 华盛顿州 小部件A 10.0 0.0 0.0
3 加利福尼亚州 华盛顿州 小部件B 5.0 0.0 0.0
4 纽约州 新泽西州 小部件A 0.0 7.0 15.0
5 纽约州 新泽西州 小部件B 0.0 25.0 9.0
6 纽约州 纽约州 小部件A 0.0 24.0 0.0
7 纽约州 纽约州 小部件B 0.0 3.0 0.0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接