2013-04-18 14 views
23

पर एक कॉलम जोड़ें, मैं एक मल्टीइंडेक्स कॉलम डेटाफ्रेम के दूसरे स्तर पर एक कॉलम जोड़ना चाहता हूं।पांडा: एक मल्टीइंडेक्स कॉलम डेटाफ्रेम

In [151]: df 
Out[151]: 
first  bar     baz   
second  one  two  one  two 
A  0.487880 -0.487661 -1.030176 0.100813 
B  0.267913 1.918923 0.132791 0.178503 
C  1.550526 -0.312235 -1.177689 -0.081596 

प्रत्यक्ष काम के सामान्य चाल से काम नहीं करता:

In [152]: df['bar']['three'] = [0, 1, 2] 

In [153]: df 
Out[153]: 
first  bar     baz   
second  one  two  one  two 
A  0.487880 -0.487661 -1.030176 0.100813 
B  0.267913 1.918923 0.132791 0.178503 
C  1.550526 -0.312235 -1.177689 -0.081596 

मैं कैसे "बार" के तहत करने के लिए तीसरी पंक्ति जोड़ सकते हैं?

उत्तर

40

यह वास्तव में बहुत सरल है (Fwiw, मैं मूल रूप से सोचा था कि यह अपने तरीके से करना):

df['bar', 'three'] = [0, 1, 2] 
df = df.sort_index(axis=1) 
print(df) 

     bar      baz   
     one  two three  one  two 
A -0.212901 0.503615  0 -1.660945 0.446778 
B -0.803926 -0.417570  1 -0.336827 0.989343 
C 3.400885 -0.214245  2 0.895745 1.011671 
+0

धन्यवाद: तीन "उप कॉलम" के साथ बहु स्तरीय स्तंभ जोड़ने। मुझे कहना होगा कि यह पूरी तरह स्पष्ट नहीं है (मेरे लिए) नया कॉलम sort_index का उपयोग करने के बाद ही क्यों दिखाई देता है। – ezbentley

+2

ओह क्षमा करें कि उत्तर का हिस्सा नहीं है, बस मुझे picky है। जैसे ही आप 'डीएफ [' बार ',' तीन '] = [0, 1, 2]' कहते हैं, यह वास्तव में दिखाई देगा। डिफ़ॉल्ट रूप से पांडा इसे डेटाफ्रेम के अंत में रखेगा (बाद में [बाज़, दो])। मैं बस इसे अन्य 'बार' के साथ देखना चाहता था। – spencerlyon2

+0

मैं देखता हूं। स्पष्टीकरण के लिए धन्यवाद। – ezbentley

1

हम एक बहु-स्तरीय स्तंभ जोड़ना चाहते हैं:

स्रोत DF:

In [221]: df 
Out[221]: 
first  bar     baz 
second  one  two  one  two 
A  -1.089798 2.053026 0.470218 1.440740 
B  0.488875 0.428836 1.413451 -0.683677 
C  -0.243064 -0.069446 -0.911166 0.478370 

विकल्प 1: विभाजन का परिणाम जोड़ने: एक नया foo स्तंभ के रूप में bar/baz

In [222]: df = df.join(df[['bar']].div(df['baz']).rename(columns={'bar':'foo'})) 

In [223]: df 
Out[223]: 
first  bar     baz     foo 
second  one  two  one  two  one  two 
A  -1.089798 2.053026 0.470218 1.440740 -2.317647 1.424980 
B  0.488875 0.428836 1.413451 -0.683677 0.345873 -0.627250 
C  -0.243064 -0.069446 -0.911166 0.478370 0.266761 -0.145172 

विकल्प 2:

In [235]: df = df.join(pd.DataFrame(np.random.rand(3,3), 
    ...:       columns=pd.MultiIndex.from_product([['new'], ['one','two','three']]), 
    ...:        index=df.index)) 

In [236]: df 
Out[236]: 
first  bar     baz     new 
second  one  two  one  two  one  two  three 
A  -1.089798 2.053026 0.470218 1.440740 0.274291 0.636257 0.091048 
B  0.488875 0.428836 1.413451 -0.683677 0.668157 0.456931 0.227568 
C  -0.243064 -0.069446 -0.911166 0.478370 0.333824 0.363060 0.949672 
संबंधित मुद्दे