पंडों के डेटाफ्रेम के लिए कॉलम जोड़ें


104

यह शायद आसान है, लेकिन मेरे पास निम्न डेटा है:

डेटा फ्रेम 1 में:

index dat1
0     9
1     5

डेटा फ्रेम 2 में:

index dat2
0     7
1     6

मैं निम्नलिखित फॉर्म के साथ एक डेटा फ्रेम चाहता हूं:

index dat1  dat2
0     9     7
1     5     6

मैं का उपयोग करने की कोशिश की है append विधि है, लेकिन मुझे एक क्रॉस जॉइन (यानी कार्टेशियन उत्पाद) मिलता है।

ऐसा करने का सही तरीका क्या है?


2
क्या आपने joinविधि की कोशिश की ?
ब्रेनबार

1
data_frame_1 ['dat2'] = data_frame_2 ['dat2']
lowtech

@ लोटेक: क्या यह सुनिश्चित करता है कि सूचकांकों को ठीक से जोड़ा जाए?
बेनडुंडी

@ बेनडूंडी: हां यह करता है
16

जवाबों:


131

ऐसा लगता है कि सामान्य तौर पर आप सिर्फ एक जुड़ाव की तलाश में हैं:

> dat1 = pd.DataFrame({'dat1': [9,5]})
> dat2 = pd.DataFrame({'dat2': [7,6]})
> dat1.join(dat2)
   dat1  dat2
0     9     7
1     5     6

45
या pd.concat([dat1, dat2], axis=1)इस मामले में।
DSM

2
@BenDundee हूड के तहत एक ही कोड का बहुत से कोड और कॉन्टेक्ट इस्तेमाल करते हैं, इसलिए "राइट" तरीका शायद तभी मायने रखता है जब आप एज के मामलों पर विचार करते हैं। उदाहरण के लिए, यदि दोनों DataFrames में एक 'data' कॉलम होता है , तो ज्वाइन विफल हो जाता है , जबकि एक concat आपको दो कॉलम देगा जिसका नाम 'data' होगा।
U2EF1

@ U2EF1: मैं आपकी प्रतिक्रिया बनाम मेरी के बारे में बात कर रहा था। बिल्ली की खाल
उतारने के

@BenDundee मैं देख रहा हूं। यह विधि अद्वितीय सूचकांक को छोड़ देती है और अधिक जटिल मामलों में भी अजीब दुष्प्रभाव है। उदाहरण के लिए, यदि मेरे पास 'डेटा' नाम के दो कॉलम हैं, तो समूहीकरण / योग अलग-अलग डेटा कॉलम को समेटना शुरू कर देगा, जो लगभग निश्चित रूप से वह नहीं है जो हम चाहते हैं। स्ट्रिंग डेटा को संक्षिप्त किया जाएगा।
U2EF1

1
जैसा कि @ jeremy-z द्वारा बताया गया है, यदि वे समान सूचकांक साझा नहीं करते हैं, तो दोनों डेटासेट में अनुक्रमित रीसेट करना बहुत महत्वपूर्ण है। अन्यथा आपको NaNs पंक्तियों के साथ एक डेटासेट मिलेगा।
इज़राइल Varea


40

दोनों join()और concat()रास्ता समस्या को हल कर सकता था। हालाँकि, एक चेतावनी है जिसका मुझे उल्लेख करना है: यदि आप किसी अन्य डेटाफ़्रेम से कुछ पंक्तियों का चयन करके कुछ डेटा फ्रेम से निपटने की कोशिश कर रहे हैं तो आप या उससे पहले सूचकांक को रीसेट करें ।join()concat()

नीचे दिए गए एक उदाहरण में शामिल होने और कंकट के कुछ दिलचस्प व्यवहार को दिखाया गया है:

dat1 = pd.DataFrame({'dat1': range(4)})
dat2 = pd.DataFrame({'dat2': range(4,8)})
dat1.index = [1,3,5,7]
dat2.index = [2,4,6,8]

# way1 join 2 DataFrames
print(dat1.join(dat2))
# output
   dat1  dat2
1     0   NaN
3     1   NaN
5     2   NaN
7     3   NaN

# way2 concat 2 DataFrames
print(pd.concat([dat1,dat2],axis=1))
#output
   dat1  dat2
1   0.0   NaN
2   NaN   4.0
3   1.0   NaN
4   NaN   5.0
5   2.0   NaN
6   NaN   6.0
7   3.0   NaN
8   NaN   7.0

#reset index 
dat1 = dat1.reset_index(drop=True)
dat2 = dat2.reset_index(drop=True)
#both 2 ways to get the same result

print(dat1.join(dat2))
   dat1  dat2
0     0     4
1     1     5
2     2     6
3     3     7


print(pd.concat([dat1,dat2],axis=1))
   dat1  dat2
0     0     4
1     1     5
2     2     6
3     3     7

अच्छी तरह से और अच्छी बात कही। मैंने इंडेक्स को रीसेट किए बिना कोशिश की और
आनंद

रीसेट कदम के बिना, मेरा डेटा ठीक और अच्छा लग रहा था, लेकिन स्पष्ट रूप से कुछ पर्दे के पीछे काम नहीं करता था। इस पर ध्यान दिलाने के लिए धन्यवाद! रीसेट ने मेरे मॉडल को ऊपर और चल दिया!
इयोनू सियुता

यह स्वीकृत उत्तर होना चाहिए! यदि हम अनुक्रमणिका को रीसेट नहीं करते हैं तो यह हमेशा NaN s उत्पन्न करता है।
श्रीवत्स

इस कदम ने मुझे बचा लिया। मैं यह समझने की कोशिश कर रहा था कि या तो कॉनैट और ज्वाइन बहुत सारे NaN फेंक रहे थे। इसे साझा करने के लिए धन्यवाद।
गुस्तावो रॉटिंग


-3

बस सही Google खोज की बात है:

data = dat_1.append(dat_2)
data = data.groupby(data.index).sum()
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.