如何在 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
假设我想从 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