根据第一列的水平和第二列的条件填充一列
Fill a column based on levels of first column and condition on second column
我们有一个数据框 df,它有两列,如下所示。变量 A 有两个级别,1 和 2。变量 B 有三个级别 YES、NO 和 OTHER。我们想推导出另一个数据框df2,变量C,取值为 "1" 如果存在对于变量 A 中的任何级别至少有一个 YES,否则为“0”。
df
A B
1 YES
1 YES
1 OTHER
1 NO
1 YES
1 NO
2 YES
2 YES
2 YES
2 NO
2 YES
3 OTHER
3 NO
3 NO
3 NO
df2
A C
1 1
2 1
3 0
使用groupby
:
>>> df['B'].eq('YES').groupby(df['A']).any().astype(int).reset_index(name='C')
A C
0 1 1
1 2 1
2 3 0
一个选项是使用 defaultdict 将列 B
转换为数字,然后在 A
上分组以获得最大值:
from collections import defaultdict
d = defaultdict(int)
d['YES'] = 1
df.assign(B = df.B.map(d)).groupby('A', as_index = False).agg(C=('B', 'max'))
A C
0 1 1
1 2 1
2 3 0
我们有一个数据框 df,它有两列,如下所示。变量 A 有两个级别,1 和 2。变量 B 有三个级别 YES、NO 和 OTHER。我们想推导出另一个数据框df2,变量C,取值为 "1" 如果存在对于变量 A 中的任何级别至少有一个 YES,否则为“0”。
df
A B
1 YES
1 YES
1 OTHER
1 NO
1 YES
1 NO
2 YES
2 YES
2 YES
2 NO
2 YES
3 OTHER
3 NO
3 NO
3 NO
df2
A C
1 1
2 1
3 0
使用groupby
:
>>> df['B'].eq('YES').groupby(df['A']).any().astype(int).reset_index(name='C')
A C
0 1 1
1 2 1
2 3 0
一个选项是使用 defaultdict 将列 B
转换为数字,然后在 A
上分组以获得最大值:
from collections import defaultdict
d = defaultdict(int)
d['YES'] = 1
df.assign(B = df.B.map(d)).groupby('A', as_index = False).agg(C=('B', 'max'))
A C
0 1 1
1 2 1
2 3 0