本文介绍 Pandas DataFrame 中应用 IF 条件的5种不同方法。
具体来说,有如下5种方法:
- Set of numbers
- Set of numbers and lambda
- Strings
- Strings and lambada
- 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
通用代码结构如下:
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的代码如下:
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 条件如下:
- 当
name
是Bill
时,填值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的代码如下:
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 条件:
- 当
name
是Bill
或者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。
`set_of_numbers`: [1,2,3,4,5,6,7,8,9,10,0,0]
计划应用以下 IF 条件,然后将结果存储在现有的set_of_numbers
列中:
- 如果数字等于0,将该列数字调整为999
- 如果数字等于5,将该列数字调整为555
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 -