如何在 Python 中使用带有 getattr 函数的 pandas.DataFrame.apply

How to use pandas.DataFrame.apply with getattr function in Python

假设我想从 Pandas 中的数据框中删除 '$' 标志。我创建了一个名为 TransformFunctions 的 class,这样我就可以使用 getattr() 从 class 调用函数(原因是我正在使用另一个 JSON我将在其中列出与数据中的列关联的方法名称以进行处理的文件;因为 JSON 只接受字符串,我决定使用给定的建议调用基于字符串的方法 here)。

代码如下:

class TransformFunctions(object):
    def remove_dollar(self, cell_str):
        return float(cell_str.replace("$", "").replace(",", ""))

data = {
    'dpt':[868, 868, 69],
    'name':['B J SANDIFORD', 'C A WIGFALL', 'A E A-AWOSOGBA'],
    'address':['  DEPARTMENT OF CITYWIDE ADM', 'DEPARTMENT OF CITYWIDE ADM  ', ' HRA/DEPARTMENT OF SOCIAL S '],
    'ttl#':['12702', '12702', '52311'],
    'pc':[' X ',' X', 'A '],
    'sal-rate':['.00', '.00', ',955.00']
}
df = pd.DataFrame(data)
klass = TransformFunctions()
df['sal-rate'] = df['sal-rate'].apply(getattr(klass,'remove_dollar')()) ## here, I get TypeError: remove_dollar() missing 1 required positional argument: 'cell_str'

我想知道如何使用 pandas.DataFrame 中的 apply 来通过 getattr 调用方法(如果可能的话)。预先感谢您的 suggestions/answers!

你可以用 lambda 函数包裹起来

df['sal-rate'].apply(lambda x: getattr(klass,'remove_dollar')(x))

原因是 getattr returns 方法 remove_dollar 并且当您将 () 放在 getattr(...)。你应该这样做(即删除 ()):

df['sal-rate'] = df['sal-rate'].apply(getattr(klass,'remove_dollar'))

Out[952]:
                        address  dpt            name   pc  sal-rate   ttl#
0    DEPARTMENT OF CITYWIDE ADM  868   B J SANDIFORD   X        5.0  12702
1  DEPARTMENT OF CITYWIDE ADM    868     C A WIGFALL    X       5.0  12702
2   HRA/DEPARTMENT OF SOCIAL S    69  A E A-AWOSOGBA   A    51955.0  52311

此外,你为什么不直接使用klass.remove_dollar调用apply,例如:

df['sal-rate'].apply(klass.remove_dollar)

Out[955]:
0        5.0
1        5.0
2    51955.0
Name: sal-rate, dtype: float64