python - Groupby 基于多个逻辑条件应用于不同的列 DataFrame
问题描述
我有这个数据框:
df = pd.DataFrame({'value':[1,2,3,4,2,42,12,21,21,424,34,12,42],
'type':['big','small','medium','big','big','big','big','medium','small','small','small','medium','small'],
'entity':['R','R','R','P','R','P','P','P','R','R','P','R','R']})
value type entity
0 1 big R
1 2 small R
2 3 medium R
3 4 big P
4 2 big R
5 42 big P
6 12 big P
7 21 medium P
8 21 small R
9 424 small R
10 34 small P
11 12 medium R
12 42 small R
该操作包括按列“实体”分组,根据应用于列“值”和列“类型”的两个逻辑条件进行计数操作。就我而言,我必须在“名称”列中计算大于 3 的值,并且在“类型”列中不等于“中”。结果必须是 R=3 和 P=4。在此之后,我必须将结果添加到原始数据框中,创建一个名为“计数”的新列。我知道这个操作可以在 R 中用下面的代码完成:
df[y!='medium' & value>3 , new_var:=.N,by=entity]
df[is.na(new_var),new_var:=0,]
df[,new_var:=max(new_var),by=entity]
在之前的任务中,我只需要计算大于 3 的值作为条件。在那种情况下,结果是 R=3 和 P=4,我得到它应用下一个代码:
In []: df.groupby(['entity'])['value'].apply(lambda x: (x>3).sum())
Out[]: entity
P 5
R 4
Name: value, dtype: int64
In []: DF=pd.DataFrame(DF)
In []: DF.reset_index(inplace=True)
In []: df.merge(DF,on=['entity'],how='inner')
In []: df=df.rename(columns={'value_x':'value','value_y':'count'},inplace=True)
Out[]:
value type entity count
0 1 big R 4
1 2 small R 4
2 3 medium R 4
3 2 big R 4
4 21 small R 4
5 424 small R 4
6 12 medium R 4
7 42 small R 4
8 4 big P 5
9 42 big P 5
10 12 big P 5
11 21 medium P 5
12 34 small P 5
我的问题是:我该如何处理这两种情况?实际上,对于具有多个不同条件的一般情况,我该如何做?
解决方案
根据您的条件创建掩码 - 这里更大 bySeries.gt
不等于 bySeries.ne
链式 by&
按位AND
,然后使用GroupBy.transform
for count True
s by sum
:
mask = df['value'].gt(3) & df['type'].ne('medium')
df['count'] = mask.groupby(df['entity']).transform('sum')
带有辅助列的解决方案new
:
mask = df['value'].gt(3) & df['type'].ne('medium')
df['count'] = df.assign(new = mask).groupby('entity')['new'].transform('sum')
print (df)
value type entity count
0 1 big R 3
1 2 small R 3
2 3 medium R 3
3 4 big P 4
4 2 big R 3
5 42 big P 4
6 12 big P 4
7 21 medium P 4
8 21 small R 3
9 424 small R 3
10 34 small P 4
11 12 medium R 3
12 42 small R 3
推荐阅读
- javascript - 浏览器历史记录如何在加载时不跟踪网页 url
- sql - 修改 SQL Server 表中的 XML 数据
- assembly - 8086 如何反转寄存器中的一个字节
- django - 使用自定义应用程序在 django 管理面板中调用 ajax
- c# - 有人可以帮我理解为什么我的 TextBox 的占位符在选择 RadioButton 时不会改变吗?
- c# - 哈希集
作为列表框的数据源 - canvas - 使用像素操作时 Safari 上的黑屏
- html - 使用由三个单元格组成的菜单设置宽度
- python - 从另一个类调用函数并使用另一个类对象
- c - 静态编译 SDL2 程序时的问题