亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 178 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號