Python 新手。传统上我会尝试通过循环迭代二维数组。然而,据我了解,从性能角度来看,在 python 中不推荐这样做。处理这些相对基本的数据清理操作的正确方法是什么?
这是一个在数据帧上运行并修改它的方法。参数变量是一个字符串列表,它是一个过滤器,用于驱动哪一行的数值数据需要乘以乘数。如果该方法在
-
列中找到空字符串或 tpsw_id_core
字符串,它将在子集中将其更新为零。否则,它将乘以乘数,四舍五入并转换为 int。
def multiply_values(self, variables:list, multiplier:int):
for i,row in self.output_tab.iterrows():
if row['tpsw_id_core'] in variables:
if pd.isnull(row['tag_result']) or row['tag_result'] == "-":
self.df.at[i, 'tag_result'] = 0
else:
self.df.at[i, 'tag_result'] = int(round(float(row['tag_result']) * multiplier, 0))
我尝试了多种将
.loc
、np.where
与 apply 结合使用的方法,但均未成功,并出现各种类型的错误。
您可以使用
mask
选择子集并定义一个函数来映射到选定的行。举个简单的例子:
import pandas as pd
df = pd.DataFrame({'tpsw_id_core' : ['test1', 'test2','test3', 'test2','test3', 'test1'],
'tag_result': [ 3, None, 99, '-', 23, None]
})
variables = ['test1', 'test2']
multiplier = 55
def func(x):
if x == '-' or pd.isnull(x) :
x = 0
elif isinstance(x, (int, float)):
x = int(round(float(x*multiplier)))
return x
df['tag_result'] = df['tag_result'] \
.mask(df['tpsw_id_core'].isin(variables), df['tag_result'].map(func))
print(df)
给出:
tpsw_id_core tag_result
0 test1 165
1 test2 0
2 test3 99
3 test2 0
4 test3 23
5 test1 0