[英]'Index' object has no attribute 'levels'
我有以下命令:
def convert_housing_data_to_quarters():
import pandas as pd
housing = pd.read_csv('City_Zhvi_AllHomes.csv')
housing = housing.drop(housing.columns[6:51],axis=1)
times = housing[housing.columns[6:len(housing.columns)]]
def quarters(col):
if col.endswith(("01","02","03")):
s = col[:4] + "q1"
elif col.endswith(("04", "05", "06")):
s = col[:4] + "q2"
elif col.endswith(("07", "08", "09")):
s = col[:4] + "q3"
else:
s = col[:4] + "q4"
return s
times = times.groupby(quarters,axis=1).mean()
df = pd.concat([times, housing[['State','RegionName']]], axis=1)
arrays = [housing['State'],housing['RegionName']]
index = pd.MultiIndex.from_arrays(arrays)
index = index.sortlevel(level=0)
df = df.reindex(index,level=0)
return df
convert_housing_data_to_quarters()
但是,我不断收到错误消息:
'Index' object has no attribute 'levels'
我正在尝试创建一个分层多索引,索引顶部为“状态”(级别 = 0),后跟“区域名称”(级别 = 1)。
有人能帮我解决我哪里出错了吗?
您不能使用reindex
,因为没有MultiIndex
。 因此,在聚合之前对两列都使用DataFrame.set_index
,因此可以简化解决方案:
def convert_housing_data_to_quarters():
import pandas as pd
housing = pd.read_csv('City_Zhvi_AllHomes.csv')
housing = housing.drop(housing.columns[6:51],axis=1)
times = housing[housing.columns[6:len(housing.columns)]]
times = times.set_index(['State','RegionName']).sort_index()
def quarters(col):
if col.endswith(("01","02","03")):
s = col[:4] + "q1"
elif col.endswith(("04", "05", "06")):
s = col[:4] + "q2"
elif col.endswith(("07", "08", "09")):
s = col[:4] + "q3"
else:
s = col[:4] + "q4"
return s
return times.groupby(quarters,axis=1).mean()
convert_housing_data_to_quarters()
也可以将日期转换为季度,而不是您的 function:
def convert_housing_data_to_quarters():
housing = pd.read_csv('City_Zhvi_AllHomes.csv')
housing = housing.drop(housing.columns[6:51],axis=1)
times = housing.iloc[:, 6:len(housing.columns)]
times = times.set_index(['State','RegionName']).sort_index()
quarters = pd.to_datetime(times.columns, format='%Y-%m').to_period('Q')
return times.groupby(quarters,axis=1).mean()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.