使用pandas比较两列

时间:2014-12-14 22:33:46

标签: python pandas if-statement dataframe

以此为出发点:

a = [['10', '1.2', '4.2'], ['15', '70', '0.03'], ['8', '5', '0']]
df = pd.DataFrame(a, columns=['one', 'two', 'three'])

Out[8]: 
  one  two three
0   10  1.2   4.2
1   15  70   0.03
2    8   5     0

我想在pandas中使用类似if语句的内容。

if df['one'] >= df['two'] and df['one'] <= df['three']:
    df['que'] = df['one']

基本上,通过if语句检查每一行,创建新列。

文档说使用.all但没有示例...

8 个答案:

答案 0 :(得分:66)

您可以使用np.where。如果cond是布尔数组,AB是数组,那么

C = np.where(cond, A, B)

将C定义为A,其中cond为True,Bcond为False。

import numpy as np
import pandas as pd

a = [['10', '1.2', '4.2'], ['15', '70', '0.03'], ['8', '5', '0']]
df = pd.DataFrame(a, columns=['one', 'two', 'three'])

df['que'] = np.where((df['one'] >= df['two']) & (df['one'] <= df['three'])
                     , df['one'], np.nan)

产量

  one  two three  que
0  10  1.2   4.2   10
1  15   70  0.03  NaN
2   8    5     0  NaN

如果您有多个条件,则可以使用np.select代替。 例如,如果您希望在df['que']df['two']等于df['one'] < df['two'],那么

conditions = [
    (df['one'] >= df['two']) & (df['one'] <= df['three']), 
    df['one'] < df['two']]

choices = [df['one'], df['two']]

df['que'] = np.select(conditions, choices, default=np.nan)

产量

  one  two three  que
0  10  1.2   4.2   10
1  15   70  0.03   70
2   8    5     0  NaN

如果我们在df['one'] >= df['two']时可以假设df['one'] < df['two'] 错,那么条件和选择可以简化为

conditions = [
    df['one'] < df['two'],
    df['one'] <= df['three']]

choices = [df['two'], df['one']]

(如果df['one']df['two']包含NaN,则假设可能不正确。)


请注意

a = [['10', '1.2', '4.2'], ['15', '70', '0.03'], ['8', '5', '0']]
df = pd.DataFrame(a, columns=['one', 'two', 'three'])

使用字符串值定义DataFrame。由于它们看起来是数字的,因此最好将这些字符串转换为浮点数:

df2 = df.astype(float)

这会改变结果,因为字符串逐字符比较,而浮点数则按数字比较。

In [61]: '10' <= '4.2'
Out[61]: True

In [62]: 10 <= 4.2
Out[62]: False

答案 1 :(得分:31)

您可以将.equals用于列或整个数据框。

df['col1'].equals(df['col2'])

如果他们相等,该语句将返回True,否则为False

答案 2 :(得分:19)

您可以使用apply()并执行类似的操作

df['que'] = df.apply(lambda x : x['one'] if x['one'] >= x['two'] and x['one'] <= x['three'] else "", axis=1)

或者如果您不想使用lambda

def que(x):
    if x['one'] >= x['two'] and x['one'] <= x['three']:
        return x['one']
    else:
        ''
df['que'] = df.apply(que, axis=1)

答案 3 :(得分:8)

一种方法是使用布尔系列来索引列df['one']。这会为您提供一个新列,其中True条目与df['one']相同的行具有相同的值,False值为NaN

布尔系列仅由您的if语句提供(尽管有必要使用&代替and):

>>> df['que'] = df['one'][(df['one'] >= df['two']) & (df['one'] <= df['three'])]
>>> df
    one two three   que
0   10  1.2 4.2      10
1   15  70  0.03    NaN
2   8   5   0       NaN

如果您希望NaN值替换为其他值,则可以在新列fillna上使用que方法。我在这里使用了0而不是空字符串:

>>> df['que'] = df['que'].fillna(0)
>>> df
    one two three   que
0   10  1.2   4.2    10
1   15   70  0.03     0
2    8    5     0     0

答案 4 :(得分:4)

将每个条件包装在括号中,然后使用&运算符组合条件:

df.loc[(df['one'] >= df['two']) & (df['one'] <= df['three']), 'que'] = df['one']

您可以使用~(&#34; not&#34;运算符)来填充不匹配的行以反转匹配:

df.loc[~ ((df['one'] >= df['two']) & (df['one'] <= df['three'])), 'que'] = ''

您需要使用&~而不是andnot,因为&~运算符可以逐个使用元件。

最终结果:

df
Out[8]: 
  one  two three que
0  10  1.2   4.2  10
1  15   70  0.03    
2   8    5     0  

答案 5 :(得分:1)

如果要从数据框中检查多个条件并在其他列中输出特定选择,请使用np.select

conditions=[(condition1),(condition2)]
choices=["choice1","chocie2"]

df["new column"]=np.select=(condtion,choice,default=)

注意:没有条件,没有选择项应该匹配,如果对于两个不同的条件您有相同的选择,请重复选择文本

答案 6 :(得分:0)

我认为最接近OP直觉的是内联if语句:

df['que'] = (df['one'] if ((df['one'] >= df['two']) and (df['one'] <= df['three'])) 

答案 7 :(得分:0)

使用lambda表达式:

df[df.apply(lambda x: x['col1'] != x['col2'], axis = 1)]