猿问

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

我有 2 个 dfs:df 和 df0


df 看起来像这样:


foo bar baz

A   1   5

A   1   10

A   1   18

A   2   14

A   2   18

A   2   22

A   6   6

A   6   15

df0 像这样:


foo bar baz

A   1   0

A   2   7

A   6   5

在两个 dfs 中,“foo”可以采用除“A”之外的其他值。


我想向 df 的每一行添加 df0 的行数,其中 row.foo == df0.foo 且 row.bar < df0.bar 且 row.baz >= df0.baz。


因此,输出将是:


foo bar baz n

A   1   5   0

A   1   10  2

A   1   18  2

A   2   14  1

A   2   18  1

A   2   22  1

A   6   6   0

A   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"])


慕的地8271018
浏览 127回答 1
1回答

杨魅力

我们可以通过做一个来实现这一点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()&nbsp; foo&nbsp; bar&nbsp; baz&nbsp; n0&nbsp; &nbsp;A&nbsp; &nbsp; 1&nbsp; &nbsp; 5&nbsp; 11&nbsp; &nbsp;A&nbsp; &nbsp; 1&nbsp; &nbsp;10&nbsp; 22&nbsp; &nbsp;A&nbsp; &nbsp; 1&nbsp; &nbsp;18&nbsp; 23&nbsp; &nbsp;A&nbsp; &nbsp; 2&nbsp; &nbsp;14&nbsp; 14&nbsp; &nbsp;A&nbsp; &nbsp; 2&nbsp; &nbsp;18&nbsp; 15&nbsp; &nbsp;A&nbsp; &nbsp; 2&nbsp; &nbsp;22&nbsp; 16&nbsp; &nbsp;A&nbsp; &nbsp; 6&nbsp; &nbsp; 6&nbsp; 07&nbsp; &nbsp;A&nbsp; &nbsp; 6&nbsp; &nbsp;15&nbsp; 0
随时随地看视频慕课网APP

相关分类

Python
我要回答