繁体   English   中英

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

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

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

代码如下:

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':['$5.00', '$5.00', '$51,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'

我想知道如何使用applypandas.DataFrame通过调用方法getattr如果可能的话。 预先感谢您的建议/答案!

你可以用lambda函数包装

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

原因是getattr返回方法remove_dollar并且在将()放在getattr(...)的末尾时,您在无参数的apply内部调用了该方法。 您应该这样做(即remove () ):

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM