Python 如何根据条件创建新列?

Python 如何根据条件创建新列?,python,pandas,Python,Pandas,我有以下数据帧df: 我需要创建一个新列col3并为每个唯一的col1分配T或F:对于每个唯一的col1,如果col2中至少有一行等于a,那么col3等于T。否则,它等于F 预期结果: col1 col2 col3 1 C T 1 B T 1 A T 2 C F 2 C F 3 A T 3 C T 3 B T 我怎样才能做到?我试着用applylambda。。。解

我有以下数据帧df:

我需要创建一个新列col3并为每个唯一的col1分配T或F:对于每个唯一的col1,如果col2中至少有一行等于a,那么col3等于T。否则,它等于F

预期结果:

col1  col2  col3
1     C     T
1     B     T
1     A     T
2     C     F
2     C     F
3     A     T
3     C     T
3     B     T
我怎样才能做到?我试着用applylambda。。。解决方案,但它按行进行,仅当col1为1时才赋值T,这基本上是因为1的最后一行等于A。

使用transform检查groupby

使用transform检查groupby

您还可以使用numpy的where函数,如下所示:

>> import numpy as np
>> df['col3'] = np.where(df['col1'].isin(df[df['col2']=='A']['col1'].unique()), 'T', 'F')
>> print(df)
   col1 col2 col3
0     1    C    T
1     1    B    T
2     1    A    T
3     2    C    F
4     2    C    F
5     3    A    T
6     3    C    T
7     3    B    T
您还可以使用numpy的where函数,如下所示:

>> import numpy as np
>> df['col3'] = np.where(df['col1'].isin(df[df['col2']=='A']['col1'].unique()), 'T', 'F')
>> print(df)
   col1 col2 col3
0     1    C    T
1     1    B    T
2     1    A    T
3     2    C    F
4     2    C    F
5     3    A    T
6     3    C    T
7     3    B    T

您可以选择的另一种解决方案是将int转换为str,并使用astype'str'和str。该解决方案包含:


您可以选择的另一种解决方案是将int转换为str,并使用astype'str'和str。该解决方案包含:


谢谢但是如何创建一个具有T和F值的新列呢?我不需要真假。完美。一个快速的澄清。如果条件等于A或B,我应该如何更改eqA。我尝试了.eqA或B,但它给了我错误的结果。@Fluxy.isin['A','B']谢谢。但是如何创建一个具有T和F值的新列呢?我不需要真假。完美。一个快速的澄清。如果条件等于A或B,我应该如何更改eqA。我尝试了.eqA或B,但它给了我错误的结果。@Fluxy.isin['A','B']当我们根据df['col1']进行严格比较时,我们需要使用unique吗。isindf[df['col2']='A']因此我只相信np.where df['col1'].isindf[df['col2']='A']['col1'],'T'],我们需要使用unique来进行基于df['col1']的严格比较吗?isindf[df['col2']=='A']因此我相信简单的np.wheredf['col1'].isindf[df['col2']=='A']['col1'],T','F'可以工作。
>> import numpy as np
>> df['col3'] = np.where(df['col1'].isin(df[df['col2']=='A']['col1'].unique()), 'T', 'F')
>> print(df)
   col1 col2 col3
0     1    C    T
1     1    B    T
2     1    A    T
3     2    C    F
4     2    C    F
5     3    A    T
6     3    C    T
7     3    B    T
>>> df.assign(col3=df['col1'].astype(str).str.contains('1|3').map({True:'T', False:'F'}))
   col1 col2 col3
0     1    C    T
1     1    B    T
2     1    A    T
3     2    C    F
4     2    C    F
5     3    A    T
6     3    C    T
7     3    B    T