【问题标题】:pandas Goup and Rename DataFrame Columns namespandas Group 和 Rename DataFrame Columns 名称
【发布时间】:2017-04-05 07:53:04
【问题描述】:

使用来自 Zillow 的房屋价值数据,我的数据框有一系列列名,格式为 yyyy-mm,例如

2001-01|2000-02|2000-03|2000-04|...|2016-08

这些列中的每一列都包含该时期多个城市、州组合的平均房屋价值

RegionName      State 2000-01  2000-02  2000-03
Philadelphia    PA    53100    53200    53400

我需要对列进行分组,但它们各自的季度,提供一个平均值并将其返回到一个新的数据框。因此,对于提供的示例,我将有以下内容

RegionName     State 2000q1     2000q2 2000q3 2000q4
Philadelphia   PA    53233.33   ...    ...    ...

我不知道如何着手解决这个问题。我能够提取列名,获取最后两个字符,并将它们映射到包含季度数字的字典,但仅此而已。不知道如何重组数据

非常感谢任何帮助

【问题讨论】:

  • 看看this的答案。
  • @NickilMaveli 我喜欢您提供的链接中的答案。但是,我收到“Grouper and axis must be the same length”的组错误。文件中的数据涵盖 2000 年 1 月至 2016 年 8 月。

标签: python pandas


【解决方案1】:

这类似于MaxU's answer,但显示了一种将both日期列非日期列(RegionNameState)分组的方法.

import numpy as np
import pandas as pd
df = pd.DataFrame({'2000-01': [53100], '2000-02': [53200], '2000-03': [53400], 'RegionName': ['Philadelphia'], 'State': ['PA']})

melted = pd.melt(df, id_vars=['RegionName', 'State'], var_name='date')
melted['date'] = pd.PeriodIndex(melted['date'], freq='Q')
result = melted.groupby(['RegionName', 'State', 'date']).mean()
result = result['value'].unstack('date')

产量

date                2000Q1
RegionName   State        
Philadelphia PA      53233

首先,使用pd.melt 将所有日期列合并为一个列:

import numpy as np
import pandas as pd
df = pd.DataFrame({'2000-01': [53100], '2000-02': [53200], '2000-03': [53400], 'RegionName': ['Philadelphia'], 'State': ['PA']})

melted = pd.melt(df, id_vars=['RegionName', 'State'], var_name='date')
#      RegionName State     date  value
# 0  Philadelphia    PA  2000-01  53100
# 1  Philadelphia    PA  2000-02  53200
# 2  Philadelphia    PA  2000-03  53400

接下来,使用pd.PeriodIndex 将日期(字符串?)转换为pd.Periods。注意pd.PeriodIndex可以将不同的日期字符串转换为同一个Period:

melted['date'] = pd.PeriodIndex(melted['date'], freq='Q')
#      RegionName State   date  value
# 0  Philadelphia    PA 2000Q1  53100
# 1  Philadelphia    PA 2000Q1  53200
# 2  Philadelphia    PA 2000Q1  53400

最后,使用groupby/mean 将具有相同RegionNameStatedate 的行分组并计算每个组的平均值:

result = melted.groupby(['RegionName', 'State', 'date']).mean()
#                            value
# RegionName   State date         
# Philadelphia PA    2000Q1  53233

如果你停在这里,你的 DataFrame 会很整洁(PDF)——每一行代表一个“观察”。这通常是进一步计算的最佳形式。 (此解决方案的第一步是将原始 DataFrame 转换为 tidy 格式并非偶然——请注意,melted 还具有每一行代表一个观察的属性。)

但是,如果您愿意,可以将 date 索引级别移动到单独的列中:

result = result['value'].unstack('date')

【讨论】:

    猜你喜欢
    • 2017-01-07
    • 2019-12-22
    • 2022-11-23
    • 2015-10-22
    • 1970-01-01
    • 2016-10-24
    • 1970-01-01
    • 2021-05-28
    • 1970-01-01
    相关资源
    最近更新 更多