【问题标题】:Pandas unpivot dataframe using datetime elements from column namesPandas 使用列名中的日期时间元素取消透视数据框
【发布时间】:2020-02-24 02:58:06
【问题描述】:

假设我有一个 pandas 数据框,如下所示:

这里Store 用作id,Jan 18 - Mar 18 列表示所述商店在相应年份和月份的销售额,Trading Area 是商店的时间不变特征的示例。

为简单起见,假设销售列名称已转换为正确的日期时间格式。

预期结果:

我正在考虑使用pandas.melt,但是我不确定如何正确使用列名中包含的日期时间信息来构造年份和月份的列(显然这可以在循环中手动完成,但我需要申请这对于任意大的数据帧,这就是它变得乏味的地方,当然存在更优雅的解决方案)。

感谢任何帮助。

编辑:data = pd.DataFrame({'Store':['A', 'B', 'C'], 'Jan 18':[100, 50, 60], 'Feb 18':[120, 70, 80], 'Mar 18':[140, 90, 100], 'Trading Area':[500, 800, 700]})

【问题讨论】:

  • 您能否添加一份可以复制到文本编辑器中的数据副本?
  • @Daniel Mesejo 请检查编辑
  • 您如何获得原始数据框?换句话说,根据您加载这些数据的方式,可能有比事后按摩更简单的解决方案。
  • @mayosten 我按原样收到,不幸的是不是我的电话

标签: python-3.x pandas


【解决方案1】:

您可以通过以下方式使用melt

# melt
melted = data.melt(id_vars=['Store', 'Trading Area'], var_name='Month', value_name='Sales')

# extract month and year
melted[['Month', 'Year']] = melted.Month.str.split(expand=True)

# format year
melted['Year'] = pd.to_datetime(melted.Year, yearfirst=True, format='%y').dt.year

print(melted.sort_values('Store'))

输出

  Store  Trading Area Month  Sales  Year
0     A           500   Jan    100  2018
3     A           500   Feb    120  2018
6     A           500   Mar    140  2018
1     B           800   Jan     50  2018
4     B           800   Feb     70  2018
7     B           800   Mar     90  2018
2     C           700   Jan     60  2018
5     C           700   Feb     80  2018
8     C           700   Mar    100  2018

【讨论】:

    【解决方案2】:

    您可以先输入wide_to_long,然后输入stack

    (pd.wide_to_long(df=data,
                    stubnames=['Jan','Feb', 'Mar'],
                    i=['Store','Trading Area'],
                    j='Year',
                    sep=' '
                   )
       .stack()
       .reset_index(name='Sales')
       .rename(columns={'level_3':'Month'})
    )
    

    输出:

      Store  Trading Area  Year Month  Sales
    0     A           500    18   Jan    100
    1     A           500    18   Feb    120
    2     A           500    18   Mar    140
    3     B           800    18   Jan     50
    4     B           800    18   Feb     70
    5     B           800    18   Mar     90
    6     C           700    18   Jan     60
    7     C           700    18   Feb     80
    8     C           700    18   Mar    100
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-04
      • 1970-01-01
      • 1970-01-01
      • 2013-09-04
      • 1970-01-01
      • 2015-01-03
      相关资源
      最近更新 更多