慕的地8271018
2023-07-11 10:38:00
我有 2 個(gè) dfs:df 和 df0df 看起來(lái)像這樣: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在兩個(gè) dfs 中,“foo”可以采用除“A”之外的其他值。我想向 df 的每一行添加 df0 的行數(shù),其中 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我有一個(gè)工作版本(如下),但它迭代 df,這本質(zhì)上很慢(約 30 次迭代/秒,df 可以有數(shù)百萬(wàn)行)。是否有矢量化/更快的方法來(lái)完成相同的任務(wù)?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貢獻(xiàn)1811條經(jīng)驗(yàn) 獲得超6個(gè)贊
我們可以通過(guò)做一個(gè)來(lái)實(shí)現(xiàn)這一點(diǎn)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
添加回答
舉報(bào)
0/150
提交
取消