如何使用函数计算结果来更新数据帧的子集?

问题描述 投票:0回答:1

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 结合使用的方法,但均未成功,并出现各种类型的错误。

python pandas dataframe apply data-cleaning
1个回答
0
投票

您可以使用

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
© www.soinside.com 2019 - 2024. All rights reserved.