पंडों के डेटाफ्रेम के सूचकांक को एक कॉलम में कैसे बदलें?


456

यह बल्कि स्पष्ट लगता है, लेकिन मैं यह पता नहीं लगा सकता कि डेटा फ्रेम के सूचकांक को कॉलम में कैसे बदला जाए?

उदाहरण के लिए:

df=
        gi       ptt_loc
 0  384444683      593  
 1  384444684      594 
 2  384444686      596  

सेवा,

df=
    index1    gi       ptt_loc
 0  0     384444683      593  
 1  1     384444684      594 
 2  2     384444686      596  

जवाबों:


764

या तो:

df['index1'] = df.index

या .reset_index:

df.reset_index(level=0, inplace=True)

इसलिए, यदि आपके पास अनुक्रमणिका के 3 स्तरों के साथ एक मल्टी-इंडेक्स फ्रेम है, जैसे:

>>> df
                       val
tick       tag obs        
2016-02-26 C   2    0.0139
2016-02-27 A   2    0.5577
2016-02-28 C   6    0.0303

और आप इंडेक्स में 1 ( tick) और 3 ( obs) स्तरों को कॉलम में बदलना चाहते हैं, आप यह करेंगे:

>>> df.reset_index(level=['tick', 'obs'])
          tick  obs     val
tag                        
C   2016-02-26    2  0.0139
A   2016-02-27    2  0.5577
C   2016-02-28    6  0.0303

4
ध्यान रखें कि आपके पास प्रत्येक सूचकांक के लिए यह n बार करना होगा (जैसे यदि आपके पास दो सूचकांक हैं, तो आपको इसे दो बार करना होगा)
dval करें

34
साथ df.reset_index(level=df.index.names, inplace=True)एक कॉलम में दिए गए पूरे multiindex में बदल सकते हैं
venti

2
क्या आप उस स्तंभ पर एक इंडेक्स बना सकते हैं जिसे आपने डेटाफ़्रेम में जोड़ा है ताकि वह एक वास्तविक कॉलम और एक इंडेक्स हो?
bretcj7

2
यदि आप एक संपूर्ण मल्टीएन्डेक्स को परिवर्तित करना चाहते हैं, तो बस उपयोग करें df.reset_index(), जो इंडेक्स की संपूर्णता को कॉलम (एक कॉलम प्रति स्तर) में स्थानांतरित करता है और 0 से लेन (df) -1 के लिए एक इंटेक्स इंडेक्स बनाता है
BallpointBen

2
एक स्तंभ के लिए असाइनमेंट, उदाहरण के लिए df['index1'] = df.indexएक चेतावनी देता है: "एक मान एक DataFrame से एक स्लाइस की एक प्रति पर सेट करने की कोशिश कर रहा है।" नीचे दिखाए अनुसार, df.assign () फ़ंक्शन का उपयोग करें।
जॉन मार्क

36

MultiIndex के लिए आप इसका उपयोग करके सबइंडेक्स निकाल सकते हैं

df['si_name'] = R.index.get_level_values('si_name') 

जहां si_nameसबइंडेक्स का नाम है।


26

थोड़ा और स्पष्टता प्रदान करने के लिए, आइए एक डेटाफ़्रेम को इसके सूचकांक में दो स्तरों (एक मल्टीइंडेक्स) पर देखें।

index = pd.MultiIndex.from_product([['TX', 'FL', 'CA'], 
                                    ['North', 'South']], 
                                   names=['State', 'Direction'])

df = pd.DataFrame(index=index, 
                  data=np.random.randint(0, 10, (6,4)), 
                  columns=list('abcd'))

यहां छवि विवरण दर्ज करें

reset_indexडिफ़ॉल्ट मापदंडों के साथ कहा जाने वाला तरीका, सभी सूचकांक स्तरों को स्तंभों में परिवर्तित करता है और RangeIndexनए सूचकांक के रूप में एक सरल का उपयोग करता है ।

df.reset_index()

यहां छवि विवरण दर्ज करें

levelसूचकांक को स्तंभों में परिवर्तित करने के लिए पैरामीटर का उपयोग करें । यदि संभव हो, तो स्तर नाम का उपयोग करें, जो अधिक स्पष्ट है। यदि कोई स्तर नाम नहीं हैं, तो आप प्रत्येक स्तर को इसके पूर्णांक स्थान से संदर्भित कर सकते हैं, जो कि बाहर से 0 से शुरू होता है। आप यहां एक स्केलर मान या उन सभी अनुक्रमणिकाओं की सूची का उपयोग कर सकते हैं जिन्हें आप रीसेट करना चाहते हैं।

df.reset_index(level='State') # same as df.reset_index(level=0)

यहां छवि विवरण दर्ज करें

उस दुर्लभ घटना में जिसे आप सूचकांक को संरक्षित करना चाहते हैं और सूचकांक को एक कॉलम में बदलना चाहते हैं, आप निम्न कार्य कर सकते हैं:

# for a single level
df.assign(State=df.index.get_level_values('State'))

# for all levels
df.assign(**df.index.to_frame())

15

rename_axis + reset_index

आप पहले अपने सूचकांक को एक वांछित लेबल में बदल सकते हैं, फिर एक श्रृंखला के लिए बढ़ा सकते हैं:

df = df.rename_axis('index1').reset_index()

print(df)

   index1         gi  ptt_loc
0       0  384444683      593
1       1  384444684      594
2       2  384444686      596

यह MultiIndexडेटाफ्रेम के लिए भी काम करता है :

print(df)
#                        val
# tick       tag obs        
# 2016-02-26 C   2    0.0139
# 2016-02-27 A   2    0.5577
# 2016-02-28 C   6    0.0303

df = df.rename_axis(['index1', 'index2', 'index3']).reset_index()

print(df)

       index1 index2  index3     val
0  2016-02-26      C       2  0.0139
1  2016-02-27      A       2  0.5577
2  2016-02-28      C       6  0.0303

4

यदि आप reset_indexविधि का उपयोग करना चाहते हैं और अपने मौजूदा सूचकांक को भी संरक्षित करें, जिसका आपको उपयोग करना चाहिए:

df.reset_index().set_index('index', drop=False)

या इसे जगह में बदलने के लिए:

df.reset_index(inplace=True)
df.set_index('index', drop=False, inplace=True)

उदाहरण के लिए:

print(df)
          gi  ptt_loc
0  384444683      593
4  384444684      594
9  384444686      596

print(df.reset_index())
   index         gi  ptt_loc
0      0  384444683      593
1      4  384444684      594
2      9  384444686      596

print(df.reset_index().set_index('index', drop=False))
       index         gi  ptt_loc
index
0          0  384444683      593
4          4  384444684      594
9          9  384444686      596

और यदि आप इंडेक्स लेबल से छुटकारा पाना चाहते हैं तो आप कर सकते हैं:

df2 = df.reset_index().set_index('index', drop=False)
df2.index.name = None
print(df2)
   index         gi  ptt_loc
0      0  384444683      593
4      4  384444684      594
9      9  384444686      596

2
df1 = pd.DataFrame({"gi":[232,66,34,43],"ptt":[342,56,662,123]})
p = df1.index.values
df1.insert( 0, column="new",value = p)
df1

    new     gi     ptt
0    0      232    342
1    1      66     56 
2    2      34     662
3    3      43     123

5
मैं इस बारे में कुछ चर्चा जोड़ने का सुझाव दूंगा कि आपको यह उत्तर मौजूदा उत्तरों से बेहतर क्यों लगता है ...
dmcgrandle

0

इसे करने का एक बहुत ही सरल तरीका है रीसेट_इंडेक्स () विधि का उपयोग करना। डेटा कोड के लिए df नीचे दिए गए कोड का उपयोग करें:

df.reset_index(inplace=True)

इस तरह, इंडेक्स एक कॉलम बन जाएगा, और इनकम को ट्रू के रूप में उपयोग करके, यह स्थायी परिवर्तन बन जाएगा।


1
यह उत्तर पूर्व-स्वीकृत उत्तर से कैसे भिन्न है?
एनोसोज़
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.