在Python的pandas库中,如果你想遍历DataFrame的所有元素,并对非None
值的元素增加某个字段,可以使用applymap
函数结合条件表达式来实现。applymap
函数允许你将一个函数应用于DataFrame的每个元素。
以下是一个示例,假设我们有一些公司的报价单,以Dataframe的格式来储存,它的字段有公司名、报价金额、和金额单位的信息。但是这个数据表的格式不全,数据可能会有填漏的部分(有None字段);
如果遍历dataframe的每一行有缺失的部分,含有None值,则视为无效数据,直接返回None不做处理;
而如果三个信息都全的情况下,只需要拼接金额和金额单位,也就是拼接字符串和数值后,形成新的一列放在dataframe里。最终的结果如图:
先创建一个DataFrame示例:
import pandas as pd
import numpy as np
# 创建一个示例DataFrame
df = pd.DataFrame({
'company': ['A 公司','B 公司',None,'D公司'],
'amount': [120,1400, 1,None],
'amount_unit':['美元','千元','元',None]})
我们要处理的是,遍历DataFrame的所有行,但不对None
值进行处理,对行里面没有包含None
的部分拼接成新的一列。
可以选择直接for循环,用 iloc[ ] 遍历每一行的元素,然后用if 判断加条件来处理。这个方法这里不展示了。主要展示 applymap
函数结合条件表达式的方法,对于处理一整行的数据比较直观,代码也轻便很多。
逻辑:
- 定义一个函数,处理对行的所有元素做是否为空的判断,如果有空值,则直接返回None值;如果无空值,则进行我们需要的处理
- 直接将函数放入
applymap
函数中,这个过程约等于对所有的行进行了for循环。
整体代码如下:
import pandas as pd
import numpy as np
# 创建一个示例DataFrame
df = pd.DataFrame({
'company': ['A 公司','B 公司',None,'D公司'],
'amount': [120,1400, 1,None],
'amount_unit':['美元','千元','元',None]})
# 定义一个函数,对非None值增加字段
def merge_values(row):
if pd.isnull(row['company']) or pd.isnull(row['amount']) or pd.isnull(row['amount_unit']):
return None
else:
return str(row['amount'])+ row['amount_unit'] #后续处理条件
# # 使用applymap应用函数,应用函数到DataFrame的每一行
df['Combined'] = df.apply(merge_values, axis=1)
# 检查结果
print(df)
如果你需要对某些特定列进行操作,也可以使用apply
函数,但需要指定axis=0
来按行操作:
# # 使用applymap应用函数,应用函数到DataFrame的每一列
df['Combined'] = df.apply(merge_values, axis=0)