两个数据帧之间的条件语句

问题描述 投票:0回答:1

我浏览了这里的论坛来寻找答案。我正在尝试根据 df1 中的条件填充 df2 列,并且仅当 df1 和 df2 代码匹配时,才用 df1 列 X 填充 df2 列 X。

例如:

If df1['Type'] == 'X' & df1['code1'] == df2['code1'] return df1['Num']
Elif df1['Type'] == 'Y' & df1['code2'] == df2['code2'] return df1['Num']

df1 df1 example

df2 df2 example

df1 = df1.reset_index(drop=True)
df2 = df2.reset_index(drop=True)

df2.loc[(df2['code1'].isin(df1['code1'])) & (df1['Type'] == "X"), 'Num'] = df1['Num']
df2.loc[(df2['code2'].isin(df1['code2'])) & (df1['Type'] == "Y"), 'Num'] = df1['Num']
python pandas conditional-statements pandas-loc
1个回答
0
投票

您似乎正在尝试根据 df1 的某些条件填充 df2 中的“Num”列。您使用

.loc
根据条件更新 df2 中的值是正确的,但您的代码中存在一些问题。

  1. 您正在使用
    &
    运算符来组合条件。在 pandas 中,您应该使用
    &
    表示逐元素逻辑
    AND
    ,使用
    |
    表示逐元素逻辑
    OR
  2. 使用
    .loc
    按条件赋值时,应根据满足条件的行的索引从df1中选择对应的值。

以下是修复代码的方法:

import pandas as pd

# Assuming df1 and df2 are your DataFrames

# Resetting index
df1 = df1.reset_index(drop=True)
df2 = df2.reset_index(drop=True)

# Condition 1: df1['Type'] == 'X' and df1['code1'] matches df2['code1']
mask1 = (df1['Type'] == 'X') & (df2['code1'].isin(df1['code1']))
df2.loc[mask1, 'Num'] = df1.loc[df1['code1'].isin(df2.loc[mask1, 'code1']), 'Num']

# Condition 2: df1['Type'] == 'Y' and df1['code2'] matches df2['code2']
mask2 = (df1['Type'] == 'Y') & (df2['code2'].isin(df1['code2']))
df2.loc[mask2, 'Num'] = df1.loc[df1['code2'].isin(df2.loc[mask2, 'code2']), 'Num']

在此代码中:

  • 我们为每个条件创建布尔掩码
    mask1
    mask2
  • 我们使用
    .loc
    来更新 df2 中条件为 True 的值。
  • 我们使用
    .loc
    和条件为 True 的行索引从 df1 中选择相应的值。

这应根据指定的条件填充 df2 中的“Num”列。确保根据您实际的 DataFrame 列名称调整列名称('code1'、'code2'、'Type'、'Num')。

© www.soinside.com 2019 - 2024. All rights reserved.