2017-08-04 57 views
0

我試圖根據該記錄的索引值是否落在另一個數據框中兩列定義的範圍內來填充數據框中的列。根據在另一個數據框中找到的範圍填充數據框中的列

DF1的樣子:

a 
0 4 
1 45 
2 7 
3 5 
4 48 
5 44 
6 22 
7 89 
8 45 
9 44 
10 23 

和DF2是:

START STOP CLASS 
0 2 3 1 
1 5 7 2 
2 8 8 3 

我想會是什麼樣子:

a CLASS 
0 4 nan 
1 45 nan 
2 7 1 
3 5 1 
4 48 nan 
5 44 2 
6 22 2 
7 89 2 
8 45 3 
9 44 nan 
10 23 nan 

在DF2起始列是最小值範圍和STOP欄是最大值。

+0

歡迎使用Stackoverflow。你試過什麼了? – bated

+0

44怎樣纔能有2的等級值?它沒有任何間隔? – ayhan

+0

'groupby'和'reset_index'爲df2,然後'merge' – Wen

回答

0

您可以使用IntervalIndex(需要v0.20.0)。

首先構造指數:

df2.index = pd.IntervalIndex.from_arrays(df2['START'], df2['STOP'], closed='both') 

df2 
Out: 
     START STOP CLASS 
[2, 3]  2  3  1 
[5, 7]  5  7  2 
[8, 8]  8  8  3 

現在,如果你索引到第二個數據幀,將查找在間隔值。例如,

df2.loc[6] 
Out: 
START 5 
STOP  7 
CLASS 2 
Name: [5, 7], dtype: int64 

返回第二類。我不知道這是否可以合併或merge_asof但你可以使用地圖的替代使用:

df1['CLASS'] = df1.index.to_series().map(df2['CLASS']) 

注意,我第一次轉換的指數系列,以便能夠使用Series.map方法。這導致

df1 
Out: 
    a CLASS 
0 4 NaN 
1 45 NaN 
2 7 1.0 
3 5 1.0 
4 48 NaN 
5 44 2.0 
6 22 2.0 
7 89 2.0 
8 45 3.0 
9 44 NaN 
10 23 NaN 
+0

工作良好。謝謝! – jbrd435

0

替代解決方案:


classdict = df2.set_index("CLASS").to_dict("index") 

rangedict = {} 

for key,value in classdict.items(): 

    # get all items in range and assign value (the key) 
    for item in list(range(value["START"],value["STOP"]+1)): 
     rangedict[item] = key 

提取rangedict:(?)

{2: 1, 3: 1, 5: 2, 6: 2, 7: 2, 8: 3} 

現在映射以及可能格式:

df1['CLASS'] = df1.index.to_series().map(rangedict) 
df1.applymap("{0:.0f}".format) 

輸出:

a CLASS 
0 4 nan 
1 45 nan 
2 7 1 
3 5 1 
4 48 nan 
5 44 2 
6 22 2 
7 89 2 
8 45 3 
9 44 nan 
10 23 nan 
相關問題