如何将一列的值与其他列的多个值进行比较?

时间:2019-09-19 20:33:48

标签: python pandas

我不知道该怎么问,所以我举了一个例子。 目的是将 A B 列的值与 C D E 。 如果该值等于或大于(> =),则返回“ 1”,否则返回“ 0”。

     A      B     C     D     E
1   101    103   100   101   99
2   102    100   101   99    103
3   100    99    103   100   98

期望的结果是这样

A               B       
C   D   E       C   D   E
1   1   1       1   1   1
1   1   0       0   1   0
0   1   1       0   0   1

理想情况下,我想要一个函数,什么是最好的方法?

4 个答案:

答案 0 :(得分:1)

您可以使用le来检查每一列是否等于或小于A,然后等于B

cols = ['A', 'B']
compare = ['C', 'D', 'E']

for col in cols:
    print(col)
    df[compare].le(df[col], axis=0).astype(int)

输出


A
   C  D  E
0  1  1  1
1  1  1  0
2  0  1  1
B
   C  D  E
0  1  1  1
1  0  1  0
2  0  0  1

使用列名作为键来做字典会更优雅:

cols = ['A', 'B']
compare = ['C', 'D', 'E']

dct = {col: df[compare].le(df[col], axis=0).astype(int) for col in cols}

print(dct['A'], '\n')
print(dct['B'])

输出

   C  D  E
0  1  1  1
1  1  1  0
2  0  1  1 

   C  D  E
0  1  1  1
1  0  1  0
2  0  0  1

答案 1 :(得分:1)

广播如何?

compares = df[['A','B']].values[:,:,None] >= df[['C','D','E']].values[:,None, :]
compares = compares.reshape(len(df),-1)
pd.DataFrame(compares,
             columns=pd.MultiIndex.from_product((list('AB'),list('CDE')))
            ).astype(int)

输出:

   A        B      
   C  D  E  C  D  E
0  1  1  1  1  1  1
1  1  1  0  0  1  0
2  0  1  1  0  0  1

答案 2 :(得分:1)

您可以使用pandas.DataFrame.apply

例如,在您的情况下,df是此数据帧

     A      B     C     D     E
1   101    103   100   101   99
2   102    100   101   99    103
3   100    99    103   100   98

您可以执行以下操作将A与C,D和E进行比较:

df[['C', 'D', 'E']].apply(lambda x: df['A'] >= x)

这将为您提供:

C        D        E     
True     True     True     
True     True     False   
False    True     True

使用True = 1False = 0。您可以这样做,将B与C,D和E进行比较。我希望这会有所帮助。

答案 3 :(得分:1)

ABC, D, E直接比较,然后concat一起

A = df[['C','D','E']].le(df[['A']].values).astype(int)
B = df[['C','D','E']].le(df[['B']].values).astype(int)

pd.concat([A,B], axis=1, keys=['A','B'])

Out[650]:
   A        B
   C  D  E  C  D  E
1  1  1  1  1  1  1
2  1  1  0  0  1  0
3  0  1  1  0  0  1