如何在Pandas中先展示原始DataFrame输出再展示修改后输出
Pandas:先展示筛选后原始数据,再输出修改后结果
问题说明
作为新手,需要实现:先输出筛选排序后的原始DataFrame,再输出修改后的同格式DataFrame。要求仅对符合条件(esal≤1300000且country name为Indonesia或USSR)的esal值翻倍,其他列保持不变。
原始代码
import pandas as pd source = r'C:\Users\pulun\hbrag08\Durga Software\Complete Python Package\Python for Data Science\04. Pandas\DataFrame\employee_data.csv' df = pd.read_csv(source, usecols=['eno','ename','esal','city','country'], index_col='eno', sep=';') df.rename(columns={'country': 'country name'},inplace=True) print(df.sort_values(['esal']).loc[df['country name'].isin( ['Indonesia', 'USSR'])].head(n=6)) df.loc[(df['esal'] <= 1300000) & (df['country name'].isin( ['Indonesia', 'USSR']))] = df.loc[(df['esal'] <= 1300000) & (df['country name'].isin( ['Indonesia', 'USSR']))].apply(lambda x: x*2) print('your solution here')
原始输出
ename esal city country name eno 2840 Duffy Stood 1039768.45 9488 Milwaukee Plaza USSR 5590 Sawyere Clogg 1096587.82 3409 Rockefeller Alley USSR 730 Garret Attew 1104028.84 7 Walton Point USSR 9040 Marve Coalburn 1207724.68 97 Susan Point USSR 1620 Chrotoem Cleeve 1280881.36 NaN USSR 9500 Eleanore Cabrera 1294722.19 2401 Hovde Way Indonesia
期望输出
ename esal city country name eno 2840 Duffy Stood 2079536.90 9488 Milwaukee Plaza USSR 5590 Sawyere Clogg 2193175.64 3409 Rockefeller Alley USSR 730 Garret Attew 2208057.68 7 Walton Point USSR 9040 Marve Coalburn 1207724.68 97 Susan Point USSR 1620 Chrotoem Cleeve 2415449.36 NaN USSR 9500 Eleanore Cabrera 2589444.38 2401 Hovde Way Indonesia
解决方案
问题分析
原代码的apply(lambda x:x*2)会对整行所有列执行乘法操作,包括字符串类型的ename、city(字符串乘2会重复两次,比如"abc"变成"abcabc"),不符合需求。另外,修改后没有按原始筛选格式输出结果。
修正代码
import pandas as pd source = r'C:\Users\pulun\hbrag08\Durga Software\Complete Python Package\Python for Data Science\04. Pandas\DataFrame\employee_data.csv' df = pd.read_csv(source, usecols=['eno','ename','esal','city','country'], index_col='eno', sep=';') df.rename(columns={'country': 'country name'},inplace=True) # 1. 定义通用筛选条件,保存筛选排序后的原始结果 filter_condition = df['country name'].isin(['Indonesia', 'USSR']) sorted_original_df = df.sort_values(['esal']).loc[filter_condition].head(n=6) # 2. 打印原始筛选数据 print("=== 原始筛选数据 ===") print(sorted_original_df) # 3. 仅对符合条件的esal列翻倍,避免修改其他列 modify_condition = (df['esal'] <= 1300000) & filter_condition df.loc[modify_condition, 'esal'] *= 2 # 4. 按相同格式打印修改后的数据 print("\n=== 修改后数据 ===") print(df.sort_values(['esal']).loc[filter_condition].head(n=6))
代码说明
- 定义通用筛选条件
filter_condition,减少重复代码 - 提前保存原始筛选排序结果,确保前后输出格式完全一致
- 仅针对
esal列执行翻倍操作,不会改动字符串类型的列 - 分模块打印原始和修改后的数据,逻辑清晰易读
内容的提问来源于stack exchange,提问作者doughstone
相关产品推荐
相关产品推荐

