繁体   English   中英

熊猫Goup和重命名DataFrame列名称

[英]pandas Goup and Rename DataFrame Columns names

使用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   ...    ...    ...

我不知道如何开始解决这个问题。 我能够提取列名称,获取最后两个字符,然后将它们映射到包含四分之一数字的字典中,仅此而已。 不确定如何重组数据

任何帮助是极大的赞赏

这类似于MaxU的回答 ,但显示的方式 GROUPBY日期列非日期栏( 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.Period 注意, 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转换为整齐的格式-注意, melted的属性还具有每一行代表一个观察值的特性。)

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM