在 Pandas DataFrame 中应用 IF 条件的5种方法

2022-08-22 10:21:58 浏览数 (1)

本文介绍 Pandas DataFrame 中应用 IF 条件的5种不同方法。

具体来说,有如下5种方法:

  1. Set of numbers
  2. Set of numbers and lambda
  3. Strings
  4. Strings and lambada
  5. OR condition

下面,我们来一起看下几个案例。

(1) IF condition – Set of numbers

假设现在有一个由10个数字构成的DataFrame,想应用如下的 IF 条件

  • <= 4时,填值 True
  • > 4时,填值 False

创建该 IF 条件的通用代码结构如下:

代码语言:javascript复制
df.loc[df['column name'] condition, 'new column name'] = 'value if condition is met'

具体到这个例子,Python 代码可以这么写:

代码语言:javascript复制
import pandas as pd

numbers = {'set_of_numbers': [1,2,3,4,5,6,7,8,9,10]}
df = pd.DataFrame(numbers,columns=['set_of_numbers'])

df.loc[df['set_of_numbers'] <= 4, 'equal_or_lower_than_4?'] = 'True' 
df.loc[df['set_of_numbers'] > 4, 'equal_or_lower_than_4?'] = 'False' 

print (df)

查询结果如下:

(2) IF condition – set of numbers and lambda

下面看一下使用lambada表达式如何实现案例1 的查询结果。

lambada通用代码结构如下:

代码语言:javascript复制
df['new column name'] = df['column name'].apply(lambda x: 'value if condition is met' if x condition else 'value if condition is not met')

使用lambada实现案例1的代码如下:

代码语言:javascript复制
import pandas as pd

numbers = {'set_of_numbers': [1,2,3,4,5,6,7,8,9,10]}
df = pd.DataFrame(numbers,columns=['set_of_numbers'])

df['equal_or_lower_than_4?'] = df['set_of_numbers'].apply(lambda x: 'True' if x <= 4 else 'False')

print (df)

查询结果如下,与案例1相同

(3) IF condition – strings

现在,我们创建一个仅包含Jon, Bill, Maria and Emma等文本内容的DataFrame,IF 条件如下:

  • nameBill时,填值 Match
  • name不是Bill时,填值 Mismatch

实现代码如下:

代码语言:javascript复制
import pandas as pd

names = {'First_name': ['Jon','Bill','Maria','Emma']}
df = pd.DataFrame(names,columns=['First_name'])

df.loc[df['First_name'] == 'Bill', 'name_match'] = 'Match'  
df.loc[df['First_name'] != 'Bill', 'name_match'] = 'Mismatch'  
 
print (df)

查询结果如下:

(4) IF condition – strings and lambada

使用lambada表达式实现案例3的代码如下:

代码语言:javascript复制
import pandas as pd

names = {'First_name': ['Jon','Bill','Maria','Emma']}
df = pd.DataFrame(names,columns=['First_name'])

df['name_match'] = df['First_name'].apply(lambda x: 'Match' if x == 'Bill' else 'Mismatch')

print (df)

查询结果如下:

(5) IF condition with OR

最后的案例中,我们尝试实现下面的 IF 条件:

  • nameBill或者Emma时,填值 Match
  • name既不是Bill也不是Emma时,填值 Mismatch

实现代码如下:

代码语言:javascript复制
import pandas as pd

names = {'First_name': ['Jon','Bill','Maria','Emma']}
df = pd.DataFrame(names,columns=['First_name'])

df.loc[(df['First_name'] == 'Bill') | (df['First_name'] == 'Emma'), 'name_match'] = 'Match'  
df.loc[(df['First_name'] != 'Bill') & (df['First_name'] != 'Emma'), 'name_match'] = 'Mismatch'  

print (df)

查询结果如下:

在原始DataFrame列上应用 IF 条件

上面的案例中,我们学习了如何在新增列中应用 IF 条件,有时你可能会遇到将结果存储到原始DataFrame列中的需求。

假设,我们创建了一个包含12个数字的DataFrame,其最后的两个数字为0。

代码语言:javascript复制
`set_of_numbers`: [1,2,3,4,5,6,7,8,9,10,0,0]

计划应用以下 IF 条件,然后将结果存储在现有的set_of_numbers列中:

  • 如果数字等于0,将该列数字调整为999
  • 如果数字等于5,将该列数字调整为555
代码语言:javascript复制
import pandas as pd

numbers = {'set_of_numbers': [1,2,3,4,5,6,7,8,9,10,0,0]}
df = pd.DataFrame(numbers,columns=['set_of_numbers'])
print (df)

df.loc[df['set_of_numbers'] == 0, 'set_of_numbers'] = 999
df.loc[df['set_of_numbers'] == 5, 'set_of_numbers'] = 555

print (df)

下面是调整前后的结果,5变成了555,0变成了999。

在另一个实例中,假设有一个包含 NaN 值的 DataFrame。然后,可以应用 IF 条件将这些值替换为零,如下为示例代码:

代码语言:javascript复制
import pandas as pd
import numpy as np

numbers = {'set_of_numbers': [1,2,3,4,5,6,7,8,9,10,np.nan,np.nan]}
df = pd.DataFrame(numbers,columns=['set_of_numbers'])
print (df)

df.loc[df['set_of_numbers'].isnull(), 'set_of_numbers'] = 0
print (df)

如下图所示,修改前为 NaN,而修改后为0。

- END -

0 人点赞