gpt4 book ai didi

python - 在符合条件的数据框中查找第一行

转载 作者:太空宇宙 更新时间:2023-11-03 15:06:00 25 4
gpt4 key购买 nike

我有两个数据框。我的第一个数据框有两列,我想用它们来创建条件并从第二个数据框返回一个值。

df1 = (['a', 'a', 'b', 'c'], [0.4, 0.9, 0.1, 0.6])

df2 = (['a', 'a', 'b', 'b', 'c', 'c'], [0.2, 0.6, 0.3, 0.8, 0.1, 0.4],
[500, 200, 900, 400, 250, 800])

对于 df1 中的每一行,我想通过两列数据查找 df2。第一个条件是将 df1 中的字母与 df2 匹配。第二个条件是查找 df2 中数字大于 df1 的第一个数字行。如果没有数字更大,则取 df2 中与该字母匹配的第一行。

我的目标输出是:

  • df1 row[0] = 500 # 'a' 匹配 'a' & 0.4 大于 0.2
  • df1 row[1] = 200 # 'a' 匹配 'a' & 0.9 大于 0.6
  • df1 row[2] = 900 # 'b' 匹配 'b' 并且没有行大于 0.1 所以返回第一个 'b' 行
  • df1 row[3] = 800 # 'c' 匹配 'c' & 0.6 大于 0.4

对于我的问题的任何格式不当表示歉意,请提供有关发布的任何建议(这是我的第一个)。

非常感谢!

最佳答案

我认为最好避免迭代。
我按 a 列将来自 df1df2 的数据合并在一起。输出的行数是原始 df1 的两倍。然后 np.where 应用条件并将输出转换为整数。系列 s 包含输出,每个奇数值。 (因为合并来自 df1 的一行和来自 df2 的两行)

#   a    b
#0 a 0.4
#1 a 0.9
#2 b 0.1
#3 c 0.6

# a c d
#0 a 0.2 500
#1 a 0.6 200
#2 b 0.3 900
#3 b 0.8 400
#4 c 0.1 250
#5 c 0.4 800

#merged data - intersection df1 and df2 by column a
df = pd.merge(df1, df2, on=['a'], how='inner')
#apply condition
s = np.where(df['c']< df['b'], df['d'], df['d'].shift(1)).astype('int')
#odd values
s = s[1::2]
#[500 200 900 800]

#if need add data do df1 as column e
#df1['e'] = pd.Series(s, index=df1.index)

迭代解决方案(Delforge):

100 loops, best of 3: 4.67 ms per loop

合并解决方案(我):

100 loops, best of 3: 1.93 ms per loop

关于python - 在符合条件的数据框中查找第一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32805038/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com