基于行值筛选(取较小值)从两个DataFrame生成新DataFrame的问询
嘿,这事儿用pandas分分钟就能搞定!我来给你一步步拆解实现方法,包括你提到的平局处理逻辑~
首先,先把你给出的两个DataFrame用代码还原出来,方便直接测试:
import pandas as pd import numpy as np # 构造第一个DataFrame df1 = pd.DataFrame({ 'Name': ['A1', 'A2', 'A3', 'A4'], 'Value': [1, 2, 0, -3] }) # 构造第二个DataFrame df2 = pd.DataFrame({ 'Name': ['B1', 'B2', 'B3', 'B4'], 'Value': [1, -1, -10, 4] })
方法一:平局时选取首个出现的行(你的需求默认方案)
因为我们是逐行对应比较(df1第1行和df2第1行比,以此类推),所以第一步先把两个DataFrame按索引对齐合并,同时重命名列名避免冲突:
# 重命名列,区分两个DataFrame的内容 df1.columns = ['Name1', 'Value1'] df2.columns = ['Name2', 'Value2'] # 按列合并,确保每行对应位置正确 combined_df = pd.concat([df1, df2], axis=1)
接下来用numpy.where做矢量化判断——这比循环或apply效率高得多,适合大数据量:
- 如果
Value1小于等于Value2,就选df1的Name和Value - 否则选df2的内容
# 确定每行要选中的Name和Value combined_df['Selected_Name'] = np.where(combined_df['Value1'] <= combined_df['Value2'], combined_df['Name1'], combined_df['Name2']) combined_df['Selected_Value'] = np.where(combined_df['Value1'] <= combined_df['Value2'], combined_df['Value1'], combined_df['Value2']) # 提取结果列,得到最终的DataFrame final_df = combined_df[['Selected_Name', 'Selected_Value']].rename(columns={ 'Selected_Name': 'Name', 'Selected_Value': 'Value' }) print(final_df)
运行后输出正好符合你的期望:
Name Value 0 A1 1 1 B2 -1 2 B3 -10 3 A4 -3
方法二:平局时随机选取任意一行
如果想要在平局时随机选df1或df2的行,可以用apply结合随机选择逻辑:
def pick_row(row): if row['Value1'] < row['Value2']: return (row['Name1'], row['Value1']) elif row['Value1'] > row['Value2']: return (row['Name2'], row['Value2']) else: # 随机选0(对应df1)或1(对应df2) pick = np.random.choice([0, 1]) return (row['Name1'], row['Value1']) if pick == 0 else (row['Name2'], row['Value2']) # 应用函数到每一行,生成结果 random_final_df = combined_df.apply(pick_row, axis=1, result_type='expand') random_final_df.columns = ['Name', 'Value'] print(random_final_df)
每次运行这段代码,平局的第0行可能输出A1 1或者B1 1,完全随机。
内容的提问来源于stack exchange,提问作者eternity1
相关产品推荐
相关产品推荐

