[英]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日期列和非日期栏( RegionName
, State
)。
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
将具有相同RegionName
, State
和date
行分组在一起,并计算每个组的平均值:
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.