[英]Row-wise comparison of two Pandas DataFrames to extract matched results
我有一個名為df_ref
的 pandas DataFrame 就像:
a b c result
0 (-0.001, 0.00482] (-0.001, 1.0] (-0.001, 1.0] 0.622745
1 (-0.001, 0.00482] (-0.001, 1.0] (-0.001, 1.0] 0.450869
2 (-0.001, 0.00482] (-0.001, 1.0] (1.0, 5.0] 0.693840
3 (-0.001, 0.00482] (-0.001, 1.0] (1.0, 5.0] 0.484881
4 (-0.001, 0.00482] (-0.001, 1.0] (5.0, 13.0] 0.687814
... ... ... ... ... ... ...
91 (17.953, 90.0] (4.0, 480.0] (1.0, 5.0] 0.500905
92 (17.953, 90.0] (4.0, 480.0] (5.0, 13.0] 0.500905
93 (17.953, 90.0] (4.0, 480.0] (5.0, 13.0] 0.500905
94 (17.953, 90.0] (4.0, 480.0] (13.0, 1103.0] 0.500905
95 (17.953, 90.0] (4.0, 480.0] (13.0, 1103.0] 0.500905
和另一個名為df
的 DataFrame 就像:
a b c
1 0.004213 11.0 11.0
2 32.326794 0.0 0.0
3 5.415845 1.0 1.0
4 0.001968 10.0 41.0
5 0.014745 9.0 13.0
... ... ... ... ... ...
1435435 0.000185 1.0 1.0
1435436 89.999919 0.0 0.0
1435437 4.788090 1.0 1.0
1435438 7.441620 0.0 22.0
1435439 0.001053 1.0 1.0
我希望將df
的每一行與df_ref
的所有行進行比較並確定它們屬於哪一行,並從df_ref
中提取相應的result
值並將這些值放入一個包含 1,435,439 個元素的列表中(或者只是df
中的一個新列,兩者作品)。 由於數據很大,因此需要對其進行有效編碼,因此我知道簡單的循環可能不是最好的方法,這就是我尋求幫助的原因。
我假設df_ref
的a
、 b
和c
列中的值的類型是intervalIndex並且將它們組合起來你總是會得到一個唯一的組合。 如果是這種情況,那么我想解決方案可能只是為兩個 dfs 設置索引並將它們組合為 pe
In [1]: import pandas as pd
...:
...: df_ref = pd.DataFrame({
...: "a": pd.IntervalIndex.from_tuples([(-0.001, 0.00482), (-0.001, 0.00482), (-0.001, 0.00482), (-0.001, 0.00482), (1, 2)]),
...: "b": pd.IntervalIndex.from_tuples([(-0.001, 1.0), (-0.001, 1.0), (-0.001, 1.0), (1., 2.), (2, 3)]),
...: "c": pd.IntervalIndex.from_tuples([(-0.001, 1.0), (1.0, 2.0), (2.0, 5.0), (5.1, 10.0), (1, 2)]),
...: 'result': [0.622745, 0.450869, 0.693840, 0.484881, 10]
...: })
...:
...: df = pd.DataFrame([{'a': 0.003, 'b': 0.004, 'c': 0.4}, {'a': 2., 'b': 3, 'c': 0.1}])
In [2]: df_ref_idx = df_ref.set_index(['a', 'b', 'c'])
In [3]: df_idx = df.set_index(['a', 'b', 'c'])
In [4]: df_idx['result'] = df_ref_idx['result']
In [5]: df_idx
Out[5]:
result
a b c
0.003 0.004 0.4 0.622745
2.000 3.000 0.1 NaN
我花了一些時間在將來創建虛擬數據框,您可能希望共享一個片段以輕松重新創建它們(根據我的回答),以便其他人更容易幫助您。
如果這沒有幫助,請告訴我
我會做類似以下的事情。 制作名為df_ref2
的df_ref
副本,將元組拆分為單獨的列a_low
、 a_high
等。然后像這樣加入框架
df = df.join(df_ref2,
on=( (df.a >= df_ref2.a_low) & (df.a <= df_ref2.a_high) &
(df.b >= df_ref2.b_low) & (df.b <= df_ref2.b_high) &
(df.c >= df_ref2.c_low) & (df.c <= df_ref2.c_high) ),
how='inner')
df = df.drop('a_low', 'a_high', 'b_low', 'b_high', 'c_low', 'c_high')
現在您已將result
列加入df
。 請注意,您可能會增加行數,因為每個 df 行可以匹配多個 df_ref 行,因為您看到 df_ref 的前兩行具有相同的間隔。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.