是否可以使用部分列名来重塑数据框?

2024-09-29 02:28:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我刚刚开始在熊猫和数据帧中工作。我想重塑一些数据,但我不确定这样做的最佳方法。我的直觉告诉我要在帧上迭代,但我希望有更好的方法

因此,我有一个初始数据帧,如下所示:

^{tb1}$

我想让它达到以下状态:

^{tb2}$

这里有两个方面我真的很挣扎

  • 我是否有办法从原始列名中收集widget_a和widget_b,并将其放在结果的widget type列中
  • 是否有一个好的操作,以我想要的方式结束专栏?在我看来,某种形式的支点可能会起作用,但这往往会以如下列结束
^{tb3}$

我希望我只是错过了一些基本的东西,因为我过去没有和熊猫一起工作过


Tags: 数据方法状态type方式widget形式重塑
2条回答

使用^{}^{}的另一个选项:

(df.melt(['vendor_state', 'client_state', 'date'], var_name='widget_type')
   .pivot(index=['vendor_state', 'client_state', 'widget_type'], columns='date')
   .droplevel(0, axis=1)
   .rename_axis(None, axis=1)
   .reset_index()
   .replace('total_|_purchases', '', regex=True)
   .fillna(0))

#   vendor_state client_state widget_type  2021-02-01  2021-02-08  2021-03-07
# 0           CA           OR    widget_a         8.0         0.0         0.0
# 1           CA           OR    widget_b         7.0         0.0         0.0
# 2           CA           WA    widget_a        10.0         0.0         0.0
# 3           CA           WA    widget_b         5.0         0.0         0.0
# 4           NY           NJ    widget_a         0.0         7.0        15.0
# 5           NY           NJ    widget_b         0.0        25.0         9.0
# 6           NY           NY    widget_a         0.0        24.0         0.0
# 7           NY           NY    widget_b         0.0         3.0         0.0

通过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])"))

输出:

^{tb1}$

相关问题 更多 >