Python 如果聚合了多行数据,则表aggfunc将忽略类别
我试图使用pandas.pivot_表聚合数据帧,发现在分类系列上聚合多行时,数据帧的行为不同 来自的代码有助于解释(尽管问题与我的不同) 使用分类列设置数据框:Python 如果聚合了多行数据,则表aggfunc将忽略类别,python,pandas,dataframe,Python,Pandas,Dataframe,我试图使用pandas.pivot_表聚合数据帧,发现在分类系列上聚合多行时,数据帧的行为不同 来自的代码有助于解释(尽管问题与我的不同) 使用分类列设置数据框: import pandas as pd stations = ['Kings Cross Station', 'Newtown Station', 'Parramatta Station', 'Town Hall Station', 'Central Station', 'Circular Quay Stat
import pandas as pd
stations = ['Kings Cross Station', 'Newtown Station', 'Parramatta Station',
'Town Hall Station', 'Central Station', 'Circular Quay Station',
'Martin Place Station', 'Museum Station', 'St James Station',
'Bondi Junction Station', 'North Sydney Station']
df1 = pd.DataFrame({'Station': ['Kings Cross Station', 'Newtown Station', 'Parramatta Station',
'Kings Cross Station', 'Newtown Station', 'Parramatta Station',
'Kings Cross Station', 'Newtown Station', 'Parramatta Station'],
'Date': pd.DatetimeIndex(['1/1/2017', '1/1/2017', '1/1/2017',
'2/1/2017', '2/1/2017', '2/1/2017',
'3/1/2017', '3/1/2017', '3/1/2017',]),
'Exit': range(0, 9)})
df1.Station = df1.Station.astype(pd.CategoricalDtype(stations, ordered=True))
如果我用
df1.pivot_table(index = 'Date', columns= 'Station', values = 'Exit',
dropna=False, observed=False, aggfunc=len, fill_value=0)
我得到了一个包含所有类别的数据框,其中数据框中没有数据的站点作为列填充0,这就是我想要的:
Station Kings Cross Station ... North Sydney Station
Date ...
2017-01-01 1 ... 0
2017-02-01 1 ... 0
2017-03-01 1 ... 0
[3 rows x 11 columns]
但是,如果我添加一些具有重复值的行:
df2 = pd.DataFrame({'Station': ['Kings Cross Station', 'Newtown Station', 'Parramatta Station',
'Kings Cross Station', 'Newtown Station', 'Parramatta Station'],
'Date': pd.DatetimeIndex(['1/1/2017', '1/1/2017', '1/1/2017',
'2/1/2017', '2/1/2017', '2/1/2017']),
'Exit': range(0, 6)})
df3 = pd.concat([df1, df2])
。。。和支点
df3.pivot_table(index = 'Date', columns= 'Station', values = 'Exit',
dropna=False, observed=False, aggfunc=len, fill_value=0)
现在,df3
中未表示的站不在轴中:
Station Kings Cross Station Newtown Station Parramatta Station
Date
2017-01-01 2 2 2
2017-02-01 2 2 2
2017-03-01 1 1 1
我可以通过迭代类别来添加缺少的类别,如果不是在透视表中,我可以添加一列0,但是应该用pandas来完成,当然
我希望这是明确的第一个问题!
多谢各位
这是因为df2.电台
还不是一个类别。必须应用与对df1
到df2
相同的转换,枢轴才能工作
在concat之前添加此行可以解决此问题:
df2.Station=df2.Station.astype(pd.CategoricalDtype(stations,ordered=True))
df1.dtypes
Station category
Date datetime64[ns]
Exit int64
dtype: object
df2.dtypes
Station object
Date datetime64[ns]
Exit int64
dtype: object