给定一个带有特定事件“名称”的数据框,它发生的年份及其类型,如下所示:
index name year type extracolumns
0 'a' 2014 'X' stuff
1 'a' 2014 'X' stuff
2 'a' 2014 'Y' stuff
3 'a' 2014 'Y' stuff
4 'a' 2015 'X' stuff
5 'a' 2015 'X' stuff
6 'a' 2015 'Y' stuff
7 'b' 2014 'X' stuff
8 'b' 2015 'Y' stuff
9 'c' 2014 'Z' stuff
我想要一个由事件的“名称”索引的数据框,它按年份对每个“类型”进行计数。理想情况下,它看起来像:
index type_X_2014 type_Y_2014 type_Z_2014 type_X_2015 type_Y_2015 type_Z_2015
'a' 2 2 0 2 1 0
'b' 1 0 0 0 1 0
'c' 0 0 1 0 0 0
这应该有 nunique(types)*nunique(years) 列。显然,这将涉及 groupby 和一些 value_counts。有没有一种方法可以动态完成此操作,而无需对列名进行硬编码?非常感谢。
您可以使用pd.crosstab
创建频率表:
import sys
import pandas as pd
pd.options.display.width = sys.maxsize
df = pd.DataFrame({'extracolumns': ['stuff', 'stuff', 'stuff', 'stuff', 'stuff', 'stuff', 'stuff', 'stuff', 'stuff', 'stuff'], 'index': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 'name': ['a', 'a', 'a', 'a', 'a', 'a', 'a', 'b', 'b', 'c'], 'type': ['X', 'X', 'Y', 'Y', 'X', 'X', 'Y', 'X', 'Y', 'Z'], 'year': [2014, 2014, 2014, 2014, 2015, 2015, 2015, 2014, 2015, 2014]})
result = pd.crosstab(df['name'], [df['year'], df['type']], dropna=False)
result.columns = ['type_{}_{}'.format(typ,year) for year,typ in result.columns]
print(result)
产量
type_X_2014 type_Y_2014 type_Z_2014 type_X_2015 type_Y_2015 type_Z_2015
name
a 2 2 0 2 1 0
b 1 0 0 0 1 0
c 0 0 1 0 0 0
如果您不想对列名进行硬编码,但您知道列的位置(序数索引),那么您可以使用iloc
按位置引用列:
result = pd.crosstab(df.iloc[:,1], [df.iloc[:, 2], df.iloc[:, 3]])
即使所有频率都为零,仍保留列的dropna=False
原因crosstab
。这确保了有nunique(types)*nunique(years)
列——包括type_Z_2015
.
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句