我想算风暴的每个类别为每一个独特x
和y
组合的数量。例如。我的数据框的样子:
x y year Category
1 1 1988 3
2 1 1977 1
2 1 1999 2
3 2 1990 4
我想创建一个数据帧,看起来像:
x y Category 1 Category 2 Category 3 Category 4
1 1 0 0 1 0
2 1 1 1 0 0
3 2 0 0 0 1
我曾尝试.groupby()
和.count()
的各种组合,但我仍然没有得到想要的结果。衣柜里的东西,我可以得到的是:
df[['x','y','Category']].groupby(['Category']).count()
但是,结果所有x
和y
,而不是唯一对统计:
Cat x y
1 3773 3773
2 1230 1230
3 604 604
4 266 266
5 50 50
NA 27620 27620
TS 16884 16884
有谁知道如何根据其他两列的一个数据帧中唯一做的一列的计数操作?
pivot_table
听起来像你想要什么。一个黑客的一点是添加1
的一列用来计数。这允许pivot_table
添加1
特定x
-y
和Category
组合的每个发生。你会设置这个新列在value
您pivot_table
参数和aggfunc
paraemter到np.sum
。你可能会想设置fill_value
到0
还有:
df['count'] = 1
result = df.pivot_table(
index=['x', 'y'], columns='Category', values='count',
fill_value=0, aggfunc=np.sum
)
result
:
Category 1 2 3 4
x y
1 1 0 0 1 0
2 1 1 1 0 0
3 2 0 0 0 1
如果你有兴趣在保持x
和y
为列,具有其他列名Category X
,您可以重命名列和使用reset_index
:
result.columns = [f'Category {x}' for x in result.columns]
result = a.reset_index()
您可以使用pd.get_dummies
设置索引后使用set_index
,然后用sum
与level
参数塌陷行:
pd.get_dummies(df.set_index(['x','y'])['Category'].astype(str),
prefix='Category ',
prefix_sep='')\
.sum(level=[0,1])\
.reset_index()
输出:
x y Category 1 Category 2 Category 3 Category 4
0 1 1 0 0 1 0
1 2 1 1 1 0 0
2 3 2 0 0 0 1
或者使用groupby
两次,用了很多的附加,即get_dummies
与apply
等...
喜欢:
>>> df.join(df.groupby(['x','y'])['Category']
.apply(lambda x: x.astype(str).str.get_dummies().add_prefix('Category ')))
.groupby(['x','y']).sum().fillna(0).drop(['year','Category'],1).reset_index()
x y Category 1 Category 2 Category 3 Category 4
0 1 1 0.0 0.0 1.0 0.0
1 2 1 1.0 1.0 0.0 0.0
2 3 2 0.0 0.0 0.0 1.0
>>>
你可以先使用groupby:
df_new = df.groupby(['x', 'y', 'Category']).count()
df_new
year count
x y Category
1 1 3 1 1
2 1 1 1 1
2 1 1
3 2 4 1 1
df_new = df_new.pivot_table(index=['x', 'y'], columns='Category', values='count', fill_value=0)
df_new
Category 1 2 3 4
x y
1 1 0 0 1 0
2 1 1 1 0 0
3 2 0 0 0 1