2014-04-25 6 views
6

मैं जो ऑपरेशन करना चाहता हूं वह विलय के समान है। उदाहरण के लिए, inner विलय के साथ हमें एक डेटा फ्रेम मिलता है जिसमें पंक्तियां होती हैं जो पहले और दूसरे डेटा फ्रेम में मौजूद होती हैं। outer विलय के साथ हमें एक डेटा फ्रेम मिलता है जो पहले या दूसरे डेटा फ्रेम में मौजूद होता है।एक पांडा डेटा फ्रेम की पंक्तियों को दूसरे से कैसे घटाएं?

मुझे जो डेटा चाहिए वह एक डेटा फ्रेम है जिसमें पंक्तियां हैं जो पहले डेटा फ्रेम में मौजूद हैं और दूसरे में मौजूद नहीं हैं? क्या ऐसा करने का एक तेज़ और सुरुचिपूर्ण तरीका है?

+0

कैसे = 'बाएं'? निश्चित रूप से यह नहीं है कि आप क्या चाहते हैं (आपका एसओ स्कोर दिया गया है उससे अधिक जटिल होना चाहिए) –

+0

बाएं या दाएं विलय मुझे एक डेटा फ्रेम देता है जिसमें पंक्तियों में से एक पंक्ति में मौजूद पंक्तियां होती हैं। लेकिन मुझे एक डेटा फ्रेम की आवश्यकता है जिसमें पंक्तियां शामिल हैं जो एक डेटा फ्रेम में मौजूद हैं और किसी अन्य में मौजूद नहीं हैं। – Roman

+0

यदि यह सिर्फ एक विलय कुंजी है तो आप इसे 'isin' और '~' –

उत्तर

6

निम्नलिखित में से कुछ के बारे में कैसे?

print df1 

    Team Year foo 
0 Hawks 2001 5 
1 Hawks 2004 4 
2 Nets 1987 3 
3 Nets 1988 6 
4 Nets 2001 8 
5 Nets 2000 10 
6 Heat 2004 6 
7 Pacers 2003 12 

print df2 

    Team Year foo 
0 Pacers 2003 12 
1 Heat 2004 6 
2 Nets 1988 6 

जब तक है के रूप में वहाँ एक गैर कुंजी आमतौर पर स्तंभ नाम है, आप काम sufffexes पर जोड़ा है दे सकते हैं (अगर कोई गैर कुंजी आम स्तंभ है, तो आप अस्थायी रूप से उपयोग करने के लिए एक बना सकते हैं .. । df1['common'] = 1 और df2['common'] = 1):

new = df1.merge(df2,on=['Team','Year'],how='left') 
print new[new.foo_y.isnull()] 

    Team Year foo_x foo_y 
0 Hawks 2001  5 NaN 
1 Hawks 2004  4 NaN 
2 Nets 1987  3 NaN 
4 Nets 2001  8 NaN 
5 Nets 2000  10 NaN 

या आप isin उपयोग कर सकते हैं लेकिन आप एक ही कुंजी बनाना होगा:

df1['key'] = df1['Team'] + df1['Year'].astype(str) 
df2['key'] = df1['Team'] + df2['Year'].astype(str) 
print df1[~df1.key.isin(df2.key)] 

    Team Year foo   key 
0 Hawks 2001 5 Hawks2001 
2 Nets 1987 3 Nets1987 
4 Nets 2001 8 Nets2001 
5 Nets 2000 10 Nets2000 
6 Heat 2004 6 Heat2004 
7 Pacers 2003 12 Pacers2003 
4

आप ई करना पड़ सकता है अगर आपके गैर-इंडेक्स कॉलम में NaN के साथ कक्ष हैं तो rrors।

print df1 

    Team Year foo 
0 Hawks 2001 5 
1 Hawks 2004 4 
2 Nets 1987 3 
3 Nets 1988 6 
4 Nets 2001 8 
5 Nets 2000 10 
6 Heat 2004 6 
7 Pacers 2003 12 
8 Problem 2112 NaN 


print df2 

    Team Year foo 
0 Pacers 2003 12 
1 Heat 2004 6 
2 Nets 1988 6 
3 Problem 2112 NaN 

new = df1.merge(df2,on=['Team','Year'],how='left') 
print new[new.foo_y.isnull()] 

    Team Year foo_x foo_y 
0 Hawks 2001  5 NaN 
1 Hawks 2004  4 NaN 
2 Nets 1987  3 NaN 
4 Nets 2001  8 NaN 
5 Nets 2000  10 NaN 
6 Problem 2112 NaN NaN 

2112 में समस्या टीम के पास किसी भी तालिका में foo के लिए कोई मूल्य नहीं है। इसलिए, यहां शामिल बाएं उस पंक्ति को झूठी वापसी करेंगे, जो डेटाफ्रेम दोनों में मेल खाता है, जैसा कि सही डेटाफ्रेम में मौजूद नहीं है।

समाधान:

मुझे क्या करना भीतरी DataFrame के लिए एक अनूठा स्तंभ जोड़ सकते हैं और सभी पंक्तियों के लिए एक मूल्य निर्धारित करने के लिए है। फिर जब आप शामिल हों, तो आप यह देखने के लिए जांच सकते हैं कि बाहरी तालिका में अद्वितीय रिकॉर्ड खोजने के लिए आंतरिक कॉलम के लिए वह कॉलम NaN है या नहीं।

df2['in_df2']='yes' 

print df2 

    Team Year foo in_df2 
0 Pacers 2003 12  yes 
1 Heat 2004 6  yes 
2 Nets 1988 6  yes 
3 Problem 2112 NaN  yes 


new = df1.merge(df2,on=['Team','Year'],how='left') 
print new[new.in_df2.isnull()] 

    Team Year foo_x foo_y in_df1 in_df2 
0 Hawks 2001  5 NaN  yes  NaN 
1 Hawks 2004  4 NaN  yes  NaN 
2 Nets 1987  3 NaN  yes  NaN 
4 Nets 2001  8 NaN  yes  NaN 
5 Nets 2000  10 NaN  yes  NaN 

एनबी। समस्या पंक्ति अब सही ढंग से फ़िल्टर की गई है, क्योंकि इसमें in_df2 का मान है।

Problem 2112 NaN NaN  yes  yes 
+0

बढ़िया, यह मेरे लिए ठीक काम किया। – Dirk

3

के बाद विचार करें:

  1. df_one पहले DataFrame
  2. df_two है दूसरा DataFrame पहले DataFrame में

वर्तमान और नहीं दूसरा है DataFrame

समाधान: सूचकांक df = df_one[~df_one.index.isin(df_two.index)]

सूचकांक के लिए आवश्यक स्तंभ जिस पर आप बहिष्कार करने की इच्छा से बदला जा सकता है। उपर्युक्त उदाहरण में, मैंने डेटा फ्रेम्स

दोनों के बीच संदर्भ के रूप में अनुक्रमणिका का उपयोग किया है इसके अतिरिक्त, आप बूलियन पांडा का उपयोग करके एक और जटिल क्वेरी का भी उपयोग कर सकते हैं।उपरोक्त के लिए हल करने के लिए श्रृंखला।

संबंधित मुद्दे