2017-09-12 44 views
5

मैं एक dataframe Aसबसे तेजी से रास्ता

ip_address 
0 13 
1 5 
2 20 
3 11 
.. ........ 

और एक अन्य dataframe B

lowerbound_ip_address upperbound_ip_address   country 
0 0      10        Australia 
1 11      20        China 

इस मैं में एक स्तंभ जोड़ने की जरूरत है के आधार पर

ip_address country 
13   China 
5   Australia 
A ऐसा है कि

मुझे एक विचार है कि मुझे एक समारोह को परिभाषित करना चाहिए और फिर मानचित्र पर मानचित्र को कॉल करना चाहिए ए की चो पंक्ति। लेकिन मैं इसके लिए बी की प्रत्येक पंक्ति के माध्यम से कैसे खोज करूंगा। क्या ऐसा करने के लिए इससे अच्छा तरीका है।

+0

10 के निश्चित अंतराल में निचले और ऊपरी सीमाएं हैं? – ShreyasG

+0

@ShreyasG नहीं वे –

उत्तर

0

प्रयास करें pd.merge_asof

df['lowerbound_ip_address']=df['ip_address'] 
pd.merge_asof(df1,df,on='lowerbound_ip_address',direction ='forward',allow_exact_matches =False) 
Out[811]: 
    lowerbound_ip_address upperbound_ip_address country ip_address 
0      0      10 Australia   5 
1      11      20  China   13 
9

उपयोग pd.IntervalIndex

In [2503]: s = pd.IntervalIndex.from_arrays(dfb.lowerbound_ip_address, 
              dfb.upperbound_ip_address, 'both') 

In [2504]: dfa.assign(country=dfb.set_index(s).loc[dfa.ip_address].country.values) 
Out[2504]: 
    ip_address country 
0   13  China 
1   5 Australia 
2   20  China 
3   11  China 

विवरण

In [2505]: s 
Out[2505]: 
IntervalIndex([[0, 10], [11, 20]] 
       closed='both', 
       dtype='interval[int64]') 

In [2507]: dfb.set_index(s) 
Out[2507]: 
      lowerbound_ip_address upperbound_ip_address country 
[0, 10]      0      10 Australia 
[11, 20]      11      20  China 

In [2506]: dfb.set_index(s).loc[dfa.ip_address] 
Out[2506]: 
      lowerbound_ip_address upperbound_ip_address country 
[11, 20]      11      20  China 
[0, 10]      0      10 Australia 
[11, 20]      11      20  China 
[11, 20]      11      20  China 

सेटअप

In [2508]: dfa 
Out[2508]: 
    ip_address 
0   13 
1   5 
2   20 
3   11 

In [2509]: dfb 
Out[2509]: 
    lowerbound_ip_address upperbound_ip_address country 
0      0      10 Australia 
1      11      20  China 
+1

तय नहीं हैं यह सही समाधान है :) – Wen

+0

इंटरवल इंडेक्स का अच्छा उपयोग; इस तरह के दस्तावेज़ों के लिए एक छोटा सा उदाहरण जोड़ना चाहते हैं? – Jeff

2

इंटरवल इंडेक्स पांडा 0.20.0 के रूप में है और इसका उपयोग करके जॉन जोल्ट द्वारा समाधान उत्कृष्ट है।

उस संस्करण से पहले, यह समाधान काम करेगा जो पूरी श्रृंखला के लिए देश द्वारा आईपी पते को फैलाता है।

df_ip = pd.concat([pd.DataFrame(
    {'ip_address': range(row['lowerbound_ip_address'], row['upperbound_ip_address'] + 1), 
    'country': row['country']}) 
    for _, row in dfb.iterrows()]).set_index('ip_address') 
>>> dfa.set_index('ip_address').join(df_ip) 
       country 
ip_address   
13    China 
5   Australia 
20    China 
11    China 
संबंधित मुद्दे