我有 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 回答
![?](http://img1.sycdn.imooc.com/533e4d510001c2ad02000200-100-100.jpg)
杨魅力
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
添加回答
举报
0/150
提交
取消