自定义percent函数处理两个DataFrame异常:仅返回第一个且原数据未修改
问题原因分析
1. 循环仅执行一次就终止,未处理第二个DataFrame
你的函数在for df in dataframes_list:循环的第一次迭代(处理a时)就执行了return df,这会直接终止函数运行,循环根本没机会处理第二个DataFrame b,所以最终只返回了a处理后的结果。
2. 原DataFrame未出现预期修改的原因
- 虽然开头的
df.rename(..., inplace=True)会原地修改原DataFrame的列名,但后续的df = (df.filter(...).groupby(...).agg(...))等操作是重新创建了新的DataFrame对象并赋值给局部变量df,这个新变量和传入的原DataFrame已经不是同一个对象,所以后续修改不会作用到原DataFramea上。 - 你最终返回的是新创建的df,原df的后续处理结果并没有同步到原对象中。
3. 打印语句错误
你最后执行的print(percent)是打印函数对象本身,而不是处理后的结果percent_df,正确的写法应该是print(percent_df)。
修正方案示例
如果想要同时处理两个DataFrame并返回处理后的结果,可以修改函数如下:
import pandas as pd def percent(a, b): dataframes_list = [a, b] processed_results = [] for df in dataframes_list: # 复制原数据,避免修改原DataFrame(若需修改原数据可调整逻辑) temp_df = df.copy() temp_df.rename(columns={'A': 'q1', 'B': 'q2', 'C': 'q3', 'D': 'q4', 'E': 'q5', 'F': 'q6'}, inplace = True) temp_df = temp_df.filter(like='q').groupby([temp_df['Name'], temp_df['Type'], temp_df['Date']]).agg(lambda x: x.eq(4).sum()/x.count()) temp_df = temp_df.reset_index() temp_df = pd.melt(temp_df, id_vars=['Name','Type','Date'], value_vars=['q1','q2','q3','q4','q5','q6']) temp_df.rename(columns={'value':'percent'}, inplace = True) processed_results.append(temp_df) # 返回处理后的两个DataFrame组成的列表 return processed_results # 获取处理后的两个结果 df_a_result, df_b_result = percent(a, b) # 打印第一个处理结果 print(df_a_result) # 打印第二个处理结果 print(df_b_result)
如果确实需要修改原DataFrame,需注意pandas的groupby、melt等操作大多无法原地执行,更推荐返回新的处理后数据,避免污染原数据。
内容的提问来源于stack exchange,提问作者Skywalker5032
相关产品推荐
相关产品推荐

