根据条件在数据框中查找值

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

我有一个主数据框和三个较小的数据框。最终,我想在主数据框中创建一个新列,指示每行是否满足两个条件。

  1. 主数据帧 A 列中的值出现在任何较小数据帧的 BB 列中。
  2. 对于 A 列和 BB 列的值匹配的行,主数据帧的 B 列与任何较小数据帧的列之间的差异小于 5。

为了简单起见,我只包含了较小的数据帧之一。

data = [['Tom', 10], ['Nick', 15], ['Juli', 14], ['Tom', 7], ['Juli', 9]]

main_df = pd.DataFrame(data, columns=['A', 'B'])

    A     B
0  Tom    10
1  Nick   15
2  Juli   14
3  Tom     7
4  Juli   9

data1 = [[5, 'Juli'], [17, 'Tom'], [6, 'Juli'], [8,'Tom']]

df1 = pd.DataFrame(data1, columns=['AA', 'BB'])

   AA   BB
0  5   Juli
1  17  Tom
2  6   Juli
3  8   Tom

我希望我的最终数据框看起来像这样:

    A     B    C
0  Tom    10   X
1  Nick   15
2  Juli   14    
3  Tom    7    X
4  Juli   9    X

我尝试过合并数据帧,但它创建了太多行并超出了 python 的限制。

python pandas dataframe if-statement vlookup
1个回答
0
投票
import pandas as pd

data = [['Tom', 10], ['Nick', 15], ['Juli', 14], ['Tom', 7], ['Juli', 9]]
main_df = pd.DataFrame(data, columns=['A', 'B'])

data1 = [[5, 'Juli'], [17, 'Tom'], [6, 'Juli'], [8,'Tom']]
df1 = pd.DataFrame(data1, columns=['AA', 'BB'])

main_df['C'] = main_df.apply(lambda row: 'X' if (row['A'] in df1['BB'].values) and any(abs(row['B'] - df1.loc[df1['BB'] == row['A']]['AA']) < 5) else '', axis=1)

print(main_df)

新的 C 列将添加到 main_df 数据框中,然后使用 apply 方法将函数应用于数据框的每一行。 lambda 函数检查当前行 A 列中的值是否出现在 df1 数据帧的 BB 列中,以及当前行 B 列中的值与 df1 数据帧 AA 列中的值之间的绝对差是否小于5. 如果两个条件都满足,则返回字符串“X”。否则,它返回一个空字符串。 axis=1 参数指定该函数应应用于数据帧的每一行。生成的序列被分配给 main_df 数据帧的 C 列。

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