为了账号安全,请及时绑定邮箱和手机立即绑定

Pandas 根据条件计算其他 df 中的行数

Pandas 根据条件计算其他 df 中的行数

慕的地8271018 2023-07-11 10:38:00
我有 2 个 dfs:df 和 df0df 看起来像这样:foo bar bazA   1   5A   1   10A   1   18A   2   14A   2   18A   2   22A   6   6A   6   15df0 像这样:foo bar bazA   1   0A   2   7A   6   5在两个 dfs 中,“foo”可以采用除“A”之外的其他值。我想向 df 的每一行添加 df0 的行数,其中 row.foo == df0.foo 且 row.bar < df0.bar 且 row.baz >= df0.baz。因此,输出将是:foo bar baz nA   1   5   0A   1   10  2A   1   18  2A   2   14  1A   2   18  1A   2   22  1A   6   6   0A   6   15  0我有一个工作版本(如下),但它迭代 df,这本质上很慢(约 30 次迭代/秒,df 可以有数百万行)。是否有矢量化/更快的方法来完成相同的任务?rows = []for row in df.itertuples():     rows.append([row.baz, row.foo, row.bar, len(df0.loc[(row.bar < df0.bar) & (row.baz >= df0.baz) & (row.foo == df0.foo)])])df = pd.DataFrame(rows, columns=["baz", "foo", "bar", "n"])
查看完整描述

1 回答

?
杨魅力

TA贡献1811条经验 获得超6个赞

我们可以通过做一个来实现这一点outer merge。检查您的条件并最终使用GroupBy.sum以获得您的n专栏:


dfm = df.assign(key=df.index).merge(df0, on='foo', suffixes=['', '_0'])

m = (dfm['bar'] < dfm['bar_0']) & (dfm['baz'] >= dfm['baz_0'])

df['n'] = m.groupby(dfm['key']).sum()


  foo  bar  baz  n

0   A    1    5  1

1   A    1   10  2

2   A    1   18  2

3   A    2   14  1

4   A    2   18  1

5   A    2   22  1

6   A    6    6  0

7   A    6   15  0


查看完整回答
反对 回复 2023-07-11
  • 1 回答
  • 0 关注
  • 126 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信