以两个变量为条件的Pandas中的新变量,其中一个变量跨越多行

hi3rlvi2  于 2023-01-19  发布在  其他
关注(0)|答案(2)|浏览(118)

我想在 Dataframe df中添加一列col3,其二进制结果为yesno
问题是col3中的值应该以col1col2为条件,即如果对于col1中唯一值的所有示例,col2的值也是yes,则结果将是yes。如果col2中有一个或多个值为no,则col3中的相应行也应为no
逻辑的一个简单例子。

import pandas as pd
df={"col1": [1,1,1,2,3,3,4,4], "col2": ["yes","no","yes","no","yes","yes","yes","no"]}
df = pd.DataFrame(data=df)
col1 col2
0     1  yes
1     1   no
2     1  yes
3     2   no
4     3  yes
5     3  yes
6     4  yes
7     4   no

想要的结果。

df_new
   col1 col2 col3
0     1  yes   no
1     1   no   no
2     1  yes   no
3     2   no   no
4     3  yes  yes
5     3  yes  yes
6     4  yes   no
7     4   no   no
sd2nnvve

sd2nnvve1#

您可以使用有序的CategoricalDtype来完成您想要的任务:

cat = pd.CategoricalDtype(['yes', 'no'], ordered=True)
df['col3'] =  df.astype({'col2': cat}).groupby('col1').transform('max').astype(str)
print(df)

# Output
   col1 col2 col3
0     1  yes   no
1     1   no   no
2     1  yes   no
3     2   no   no
4     3  yes  yes
5     3  yes  yes
6     4  yes   no
7     4   no   no

按字典顺序排列(是〈否):

df['col3'] = df.groupby('col1')['col2'].transform('min')
print(df)

# Output
   col1 col2 col3
0     1  yes   no
1     1   no   no
2     1  yes   no
3     2   no   no
4     3  yes  yes
5     3  yes  yes
6     4  yes   no
7     4   no   no

CategoricalDtype的优点是必须明确数据的顺序(Python的Zen)

zhte4eai

zhte4eai2#

另一种可能的解决方案:

df.assign(col3=df.groupby('col1')['col2'].transform(
    lambda x: np.where(x.eq('yes').all(), 'yes', 'no')))

输出:

col1 col2 col3
0     1  yes   no
1     1   no   no
2     1  yes   no
3     2   no   no
4     3  yes  yes
5     3  yes  yes
6     4  yes   no
7     4   no   no

相关问题