我正在尝试为每种唯一的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
有人知道如何基于数据帧中其他两列的唯一性对一列进行计数操作吗?
答案 0 :(得分:2)
pivot_table
听起来像您想要的。一点技巧是添加一列1
来进行计数。这允许pivot_table
为每次出现的特定1
-x
和y
组合添加Category
。您将在value
中将此新列设置为pivot_table
参数,并将aggfunc
参数设置为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
:< / p>
result.columns = [f'Category {x}' for x in result.columns]
result = a.reset_index()
答案 1 :(得分:1)
您可以在使用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
答案 2 :(得分:0)
或者两次使用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
>>>
答案 3 :(得分: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