You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义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已经不是同一个对象,所以后续修改不会作用到原DataFrame a上。
  • 你最终返回的是新创建的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 03:42:21