![](/img/trans.png)
[英]Count number of occurences of a particular value in each column in pandas dataframe
[英]Count occurences for each year in pandas dataframe based on subgroup
想象一下由。给出的pandas
数据框
df = pd.DataFrame({
'id': [1, 1, 1, 2, 2],
'location': [1, 2, 3, 1, 2],
'date': [pd.to_datetime('01-01-{}'.format(year)) for year in [2015, 2016, 2015, 2017, 2018]]
}).set_index('id')
看起来像这样
location date
id
1 1 2015-01-01
1 2 2016-01-01
1 3 2015-01-01
2 1 2017-01-01
2 2 2018-01-01
现在,我想为date
列中表示的每年创建一个列,该列按id
计算出现的次数。 因此,结果数据框应该是这样的
location date 2015 2016 2017 2018
id
1 1 2015-01-01 2 1 0 0
1 2 2016-01-01 2 1 0 0
1 3 2015-01-01 2 1 0 0
2 1 2017-01-01 0 0 1 1
2 2 2018-01-01 0 0 1 1
现在我想象使用pd.groupby.transform
但我无法找出最佳解决方案。
我自己的解决方案是
df['year'] = df['date'].map(lambda x: x.year)
df = pd.merge(
df,
pd.pivot_table(df, 'date', 'id', 'year', 'count').fillna(0).astype(int),
left_index=True, right_index=True).drop('year', axis=1)
get_dummies
df.join(pd.get_dummies(df.date.dt.year).sum(level=0))
date location 2015 2016 2017 2018
id
1 2015-01-01 1 2 1 0 0
1 2016-01-01 2 2 1 0 0
1 2015-01-01 3 2 1 0 0
2 2017-01-01 1 0 0 1 1
2 2018-01-01 2 0 0 1 1
factorize
i, r = pd.factorize(df.index)
j, c = pd.factorize(df.date.dt.year)
n, m = shape = len(r), len(c)
b = np.zeros(shape, dtype=np.int64)
np.add.at(b, (i, j), 1)
df.join(pd.DataFrame(b, r, c).rename_axis('id'))
date location 2015 2016 2017 2018
id
1 2015-01-01 1 2 1 0 0
1 2016-01-01 2 2 1 0 0
1 2015-01-01 3 2 1 0 0
2 2017-01-01 1 0 0 1 1
2 2018-01-01 2 0 0 1 1
创建辅助DataFrame
由groupby
与size
, unstack
和year
,并join
到原来的df
:
df1 = df.join(df.groupby(['id', df['date'].dt.year]).size().unstack(fill_value=0), on='id')
print (df1)
location date 2015 2016 2017 2018
id
1 1 2015-01-01 2 1 0 0
1 2 2016-01-01 2 1 0 0
1 3 2015-01-01 2 1 0 0
2 1 2017-01-01 0 0 1 1
2 2 2018-01-01 0 0 1 1
详情:
print (df.groupby(['id', df['date'].dt.year]).size().unstack(fill_value=0))
date 2015 2016 2017 2018
id
1 2 1 0 0
2 0 0 1 1
crosstab
另一个解决方案:
df1 = df.join(pd.crosstab(df.index, df['date'].dt.year), on='id')
print (pd.crosstab(df.index, df['date'].dt.year))
date 2015 2016 2017 2018
row_0
1 2 1 0 0
2 0 0 1 1
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.