如何在Pandas中根据条件交换行内多列对应值
解决方案
可以通过向量化条件判断+列值交换的方式高效处理,避免低效的行遍历操作,具体步骤如下:
1. 定位需要修正的行
先筛选出label_1为Under的行,这些行需要交换对应列的值:
mask = df['label_1'] == 'Under'
2. 交换odds列的值
对筛选出的行,交换odds_1和odds_2的数值(需用临时变量避免值覆盖):
temp_odds = df.loc[mask, 'odds_1'].copy() df.loc[mask, 'odds_1'] = df.loc[mask, 'odds_2'] df.loc[mask, 'odds_2'] = temp_odds
3. 统一修正label列的值
直接将所有行的label_1设为Over,label_2设为Under,完全匹配需求:
df['label_1'] = 'Over' df['label_2'] = 'Under'
完整代码示例
import pandas as pd # 构造原始数据 data = { 'odds_1': [-165, -137, -104, -117, 100, -117], 'label_1': ['Under', 'Under', 'Over', 'Over', 'Over', 'Over'], 'line_1': [3.5, 2.5, 10.5, 26.5, 2.5, 14.5], 'odds_2': [130, 108, -122, -109, -125, -109], 'label_2': ['Over', 'Over', 'Under', 'Under', 'Under', 'Under'], 'line_2': [3.5, 2.5, 10.5, 26.5, 2.5, 14.5] } df = pd.DataFrame(data) # 处理数据 mask = df['label_1'] == 'Under' temp_odds = df.loc[mask, 'odds_1'].copy() df.loc[mask, 'odds_1'] = df.loc[mask, 'odds_2'] df.loc[mask, 'odds_2'] = temp_odds df['label_1'] = 'Over' df['label_2'] = 'Under' # 输出结果 print(df.to_string(index=False))
运行结果
odds_1 label_1 line_1 odds_2 label_2 line_2 130 Over 3.5 -165 Under 3.5 108 Over 2.5 -137 Under 2.5 -104 Over 10.5 -122 Under 10.5 -117 Over 26.5 -109 Under 26.5 100 Over 2.5 -125 Under 2.5 -117 Over 14.5 -109 Under 14.5
这种方式全程使用pandas向量化操作,比iterrows效率高数倍,同时完美实现列值交换与标签统一修正的需求。
内容的提问来源于stack exchange,提问作者bismo
相关产品推荐
相关产品推荐

