पंडों का नाम बदलें DataFrame Index


142

मैं एक हेडर के बिना एक सीएसवी फ़ाइल हूँ, डेटाइम इंडेक्स के साथ। मैं सूचकांक और स्तंभ नाम का नाम बदलना चाहता हूं, लेकिन df.rename () के साथ केवल स्तंभ नाम का नाम बदला गया है। बग? मैं 0.12.0 संस्करण पर हूं

In [2]: df = pd.read_csv(r'D:\Data\DataTimeSeries_csv//seriesSM.csv', header=None, parse_dates=[[0]], index_col=[0] )

In [3]: df.head()
Out[3]: 
                   1
0                   
2002-06-18  0.112000
2002-06-22  0.190333
2002-06-26  0.134000
2002-06-30  0.093000
2002-07-04  0.098667

In [4]: df.rename(index={0:'Date'}, columns={1:'SM'}, inplace=True)

In [5]: df.head()
Out[5]: 
                  SM
0                   
2002-06-18  0.112000
2002-06-22  0.190333
2002-06-26  0.134000
2002-06-30  0.093000
2002-07-04  0.098667

5
2017 में इस सवाल पर आने वालों के लिए, विधि का बहुत विस्तृत विवरण देखने के लिए नीचे दिए गए इस उत्तर की जांच करेंrename_axis
टेड पेट्रोउ

3
और उन लोगों के लिए जिन्हें नीचे दिए गए पूरे अच्छे उत्तर को पढ़ने से परेशान नहीं किया जा सकता है, फिर त्वरित समाधान df.rename_axis("Date", axis='index', inplace=True)दस्तावेज़ीकरण के अनुसार है pandas.pydata.org/pandas-docs/stable/generated/… याdf.index.names = ['Date']
tommy.carstenen

जवाबों:


237

renameविधि सूचकांक पर लागू होता है जो सूचकांक के लिए एक शब्दकोश लेता मूल्यों
आप अनुक्रमणिका स्तर के नाम का नाम बदलना चाहते हैं:

df.index.names = ['Date']

इस बारे में सोचने का एक अच्छा तरीका यह है कि कॉलम और इंडेक्स एक ही प्रकार के ऑब्जेक्ट ( Indexया MultiIndex) हैं, और आप ट्रांसफ़ॉर्म के माध्यम से दोनों को इंटरचेंज कर सकते हैं।

यह थोड़ा भ्रमित करने वाला है क्योंकि इंडेक्स नामों का कॉलम के समान अर्थ है, इसलिए यहां कुछ और उदाहरण दिए गए हैं:

In [1]: df = pd.DataFrame([[1, 2, 3], [4, 5 ,6]], columns=list('ABC'))

In [2]: df
Out[2]: 
   A  B  C
0  1  2  3
1  4  5  6

In [3]: df1 = df.set_index('A')

In [4]: df1
Out[4]: 
   B  C
A      
1  2  3
4  5  6

आप अनुक्रमणिका पर नाम बदल सकते हैं, जो मान 1 को बदल सकता है :

In [5]: df1.rename(index={1: 'a'})
Out[5]: 
   B  C
A      
a  2  3
4  5  6

In [6]: df1.rename(columns={'B': 'BB'})
Out[6]: 
   BB  C
A       
1   2  3
4   5  6

स्तर के नामों का नाम बदलकर:

In [7]: df1.index.names = ['index']
        df1.columns.names = ['column']

नोट: यह विशेषता सिर्फ एक सूची है, और आप नाम बदलने को सूची समझ / मानचित्र के रूप में कर सकते हैं।

In [8]: df1
Out[8]: 
column  B  C
index       
1       2  3
4       5  6

2
बहुत बढ़िया जवाब। बस एक कोमल याद दिलाता है कि बिना "inplace =True", df1.renameवास्तव में कुछ भी नहीं बदलेगा।
सारा

63

वर्तमान में चयनित उत्तर में उस rename_axisविधि का उल्लेख नहीं है जिसका उपयोग सूचकांक और स्तंभ स्तरों का नाम बदलने के लिए किया जा सकता है।


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

चलिए एक DataFrame पर नज़र डालते हैं

df = pd.DataFrame({'age':[30, 2, 12],
                       'color':['blue', 'green', 'red'],
                       'food':['Steak', 'Lamb', 'Mango'],
                       'height':[165, 70, 120],
                       'score':[4.6, 8.3, 9.0],
                       'state':['NY', 'TX', 'FL']},
                       index = ['Jane', 'Nick', 'Aaron'])

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

इस DataFrame में प्रत्येक पंक्ति और स्तंभ अनुक्रमणिकाओं के लिए एक स्तर होता है। पंक्ति और स्तंभ अनुक्रमणिका दोनों का कोई नाम नहीं है। आइए पंक्ति इंडेक्स स्तर के नाम को 'नामों' में बदलें।

df.rename_axis('names')

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

rename_axisविधि को भी बदलकर स्तंभ स्तर नाम बदलने के लिए की क्षमता है axisपैरामीटर:

df.rename_axis('names').rename_axis('attributes', axis='columns')

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

यदि आप कुछ कॉलम के साथ इंडेक्स सेट करते हैं, तो कॉलम नाम नए इंडेक्स स्तर का नाम बन जाएगा। आइए अपने मूल DataFrame में सूचकांक के स्तर को देखें:

df1 = df.set_index(['state', 'color'], append=True)
df1

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

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

df1.rename_axis(['names', None, 'Colors'])

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

आप Noneसूचकांक स्तर के नामों को प्रभावी ढंग से हटाने के लिए उपयोग कर सकते हैं ।


श्रृंखला समान रूप से काम करती है लेकिन कुछ अंतरों के साथ

आइए तीन इंडेक्स स्तरों के साथ एक श्रृंखला बनाएं

s = df.set_index(['state', 'color'], append=True)['food']
s

       state  color
Jane   NY     blue     Steak
Nick   TX     green     Lamb
Aaron  FL     red      Mango
Name: food, dtype: object

हम rename_axisउसी तरह का उपयोग कर सकते हैं जो हमने डेटाफ्रैम के साथ किया था

s.rename_axis(['Names','States','Colors'])

Names  States  Colors
Jane   NY      blue      Steak
Nick   TX      green      Lamb
Aaron  FL      red       Mango
Name: food, dtype: object

ध्यान दें कि सीरीज नामक श्रृंखला के नीचे मेटाडेटा का एक अतिरिक्त टुकड़ा है Name। किसी DataFrame से एक श्रृंखला बनाते समय, यह विशेषता स्तंभ नाम पर सेट की जाती है।

हम renameइसे बदलने के लिए विधि के लिए एक स्ट्रिंग नाम पारित कर सकते हैं

s.rename('FOOOOOD')

       state  color
Jane   NY     blue     Steak
Nick   TX     green     Lamb
Aaron  FL     red      Mango
Name: FOOOOOD, dtype: object

DataFrames में यह विशेषता नहीं है और यदि इस तरह उपयोग किया जाता है तो infact एक अपवाद बढ़ाएगा

df.rename('my dataframe')
TypeError: 'str' object is not callable

पांडा 0.21 से पहले, आप rename_axisसूचकांक और स्तंभों में मूल्यों का नाम बदल सकते थे। यह पदावनत किया गया है इसलिए ऐसा न करें


1
आप के df1 = df.set_index(['state', 'color'], append=True)साथ स्वैप करना चाहिए df1.rename_axis(['names', None, 'Colors'])?
साल्विन

क्या होगा अगर मैं "निक" को "निकोलस" नाम देना चाहता हूं? यही कारण है कि जब मैं "नाम बदलकर पंडों के सूचकांक" को खोज रहा था और यहाँ समाप्त हो गया। संपादित करें: ओह रुको, स्वीकृत उत्तर यह बताता है कि, यह मेरे लिए पहले स्पष्ट नहीं था।
बेन फार्मर

अच्छा, यह एकमात्र उत्तर है जिसका उपयोग जंजीर असाइनमेंट में किया जा सकता है!
आईएएनएस

19

नए pandasसंस्करणों के लिए

df.index = df.index.rename('new name')

या

df.index.rename('new name', inplace=True)

बाद की आवश्यकता होती है यदि डेटा फ़्रेम को अपने सभी गुणों को बनाए रखना चाहिए।


18

पंडों के संस्करण में ०.१३ और अधिक से अधिक सूचकांक स्तर के नाम अपरिवर्तनीय (प्रकार FrozenList) हैं और अब सीधे सेट नहीं किए जा सकते हैं। आपको Index.rename()इंडेक्स में नए इंडेक्स स्तर के नामों को लागू करने के लिए पहले उपयोग करना होगा और फिर DataFrame.reindex()नए सूचकांक को डेटाफ्रेम में लागू करने के लिए उपयोग करना होगा। उदाहरण:

पंडों संस्करण के लिए <0.13

df.index.names = ['Date']

पंडों संस्करण के लिए> = 0.13

df = df.reindex(df.index.rename(['Date']))

9
सच नहीं! पंडों के मेरे संस्करण में (0.13.1) df.index.names = ['फू'] ठीक काम करता है!
लंदनरोब

5
यह ध्यान देने के लिए धन्यवाद कि @LondonRob - `df.index.names = ['foo']` पंडों के साथ मेरे लिए भी काम करता है 0.14। जाहिरा तौर पर यह केवल संक्षिप्त रूप से टूट गया था और इसमें शामिल था जब मैंने इसका परीक्षण किया था।
डेविड स्मिथ

1
दोनों के लिए indexया columnसीधे नाम सेट करना मेरे लिए (पंडों 0.19 पर) दोनों बदल रहा है, लेकिन इस पद्धति से नहीं।
FooBar

8

आप Index.set_namesनिम्नानुसार भी उपयोग कर सकते हैं :

In [25]: x = pd.DataFrame({'year':[1,1,1,1,2,2,2,2],
   ....:                   'country':['A','A','B','B','A','A','B','B'],
   ....:                   'prod':[1,2,1,2,1,2,1,2],
   ....:                   'val':[10,20,15,25,20,30,25,35]})

In [26]: x = x.set_index(['year','country','prod']).squeeze()

In [27]: x
Out[27]: 
year  country  prod
1     A        1       10
               2       20
      B        1       15
               2       25
2     A        1       20
               2       30
      B        1       25
               2       35
Name: val, dtype: int64
In [28]: x.index = x.index.set_names('foo', level=1)

In [29]: x
Out[29]: 
year  foo  prod
1     A    1       10
           2       20
      B    1       15
           2       25
2     A    1       20
           2       30
      B    1       25
           2       35
Name: val, dtype: int64

2
क्या यह काम कर सकता है multiIndex? MultiIndex(levels=[['A', 'B', 'C', 'D', 'E', 'F'], ['Y', 'Z']], labels=[[0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5], [0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1]], names=['Portfolio', None])क्या इसका नाम बदलना संभव Noneहै measures?
ctrl-alt-delete

2

यदि आप कॉलम और इंडेक्स दोनों के नाम बदलने के लिए एक ही मैपिंग का उपयोग करना चाहते हैं:

mapping = {0:'Date', 1:'SM'}
df.index.names = list(map(lambda name: mapping.get(name, name), df.index.names))
df.rename(columns=mapping, inplace=True)

0
df.index.rename('new name', inplace=True)

केवल वही है जो मेरे लिए काम करता है (पांडा 0.22.0)।
Inplace = true के बिना, इंडेक्स का नाम मेरे मामले में सेट नहीं है।


0

आप का उपयोग कर सकते हैं indexऔर की columnsविशेषताएँ pandas.DataFrame। नोट: सूची के तत्वों की संख्या को पंक्तियों / स्तंभों की संख्या से मेल खाना चाहिए।

#       A   B   C
# ONE   11  12  13
# TWO   21  22  23
# THREE 31  32  33

df.index = [1, 2, 3]
df.columns = ['a', 'b', 'c']
print(df)

#     a   b   c
# 1  11  12  13
# 2  21  22  23
# 3  31  32  33
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.