如何将pandas.api函数列表应用于多个DataFrame并获取结果?
解决pandas类型判断函数批量应用报错问题
问题背景
需要将一组pandas.api.types下的类型判断函数批量应用到多个DataFrame,获取各列的类型检测结果,但运行代码时触发TypeError: 'str' object is not callable错误。
错误原因
原代码中将函数对象转换为字符串存储在api_df['function']列中,后续apply时尝试直接调用字符串对象(如infer_dtype(df1)),字符串并非可调用对象,因此报错。
修正方案
直接保留函数对象进行操作,避免将函数转为字符串后再通过eval调用,以下是两种可行的实现方式:
方式一:遍历函数与DataFrame列填充结果
import pandas as pd # 构造并预处理示例DataFrame df1 = pd.DataFrame({ 'Datetime': ['2002-12-31 01:00:00', '2002-12-31 02:00:00', '2002-12-31 03:00:00', '2002-12-31 04:00:00'], 'value': [5077.0, 4939.0, 4885.0, 4857.0] }) df1['Datetime'] = pd.to_datetime(df1['Datetime']) df1 = df1.add_prefix('df1_') df2 = pd.DataFrame({ 'Datetime': ['2013-12-31 01:00:00', '2013-12-31 02:00:00', '2013-12-31 03:00:00', '2013-12-31 04:00:00', '2013-12-31 05:00:00'], 'value': [1861.0, 1835.0, 1841.0, 1872.0, 1934.0] }) df2['Datetime'] = pd.to_datetime(df2['Datetime']) df2 = df2.add_prefix('df2_') # 定义要使用的类型判断函数列表 panda_apis = [ pd.api.types.infer_dtype, pd.api.types.is_bool_dtype, pd.api.types.is_categorical_dtype, pd.api.types.is_complex_dtype, pd.api.types.is_datetime64_any_dtype, pd.api.types.is_datetime64_dtype ] # 初始化结果DataFrame api_df = pd.DataFrame({'function': [func.__name__ for func in panda_apis]}) # 遍历函数,批量填充各DataFrame列的检测结果 for func in panda_apis: # 处理df1的列 for col in df1.columns: api_df.loc[api_df['function'] == func.__name__, col] = func(df1[col]) # 处理df2的列 for col in df2.columns: api_df.loc[api_df['function'] == func.__name__, col] = func(df2[col]) print(api_df)
方式二:生成结果字典再转DataFrame(更高效简洁)
import pandas as pd # 构造并预处理示例DataFrame(同方式一) df1 = pd.DataFrame({ 'Datetime': ['2002-12-31 01:00:00', '2002-12-31 02:00:00', '2002-12-31 03:00:00', '2002-12-31 04:00:00'], 'value': [5077.0, 4939.0, 4885.0, 4857.0] }) df1['Datetime'] = pd.to_datetime(df1['Datetime']) df1 = df1.add_prefix('df1_') df2 = pd.DataFrame({ 'Datetime': ['2013-12-31 01:00:00', '2013-12-31 02:00:00', '2013-12-31 03:00:00', '2013-12-31 04:00:00', '2013-12-31 05:00:00'], 'value': [1861.0, 1835.0, 1841.0, 1872.0, 1934.0] }) df2['Datetime'] = pd.to_datetime(df2['Datetime']) df2 = df2.add_prefix('df2_') # 定义要使用的类型判断函数列表 panda_apis = [ pd.api.types.infer_dtype, pd.api.types.is_bool_dtype, pd.api.types.is_categorical_dtype, pd.api.types.is_complex_dtype, pd.api.types.is_datetime64_any_dtype, pd.api.types.is_datetime64_dtype ] # 定义函数,生成单个DataFrame的类型检测结果字典 def get_col_type_results(func, df): return {col: func(df[col]) for col in df.columns} # 收集所有函数的检测结果 results = [] for func in panda_apis: result_row = {'function': func.__name__} result_row.update(get_col_type_results(func, df1)) result_row.update(get_col_type_results(func, df2)) results.append(result_row) # 转换为DataFrame api_df = pd.DataFrame(results) print(api_df)
输出结果
运行上述代码后,将得到符合预期格式的结果:
function df1_Datetime df1_value df2_Datetime df2_value 0 infer_dtype datetime float64 datetime float64 1 is_bool_dtype False False False False 2 is_categorical_dtype False False False False 3 is_complex_dtype False False False False 4 is_datetime64_any_dtype True False True False 5 is_datetime64_dtype True False True False
内容的提问来源于stack exchange,提问作者Mainland
相关产品推荐
相关产品推荐

