पंडों में विशिष्ट कॉलम का नाम बदलें


182

मुझे एक डेटाफ्रेम मिला है data। मैं केवल एक कॉलम हेडर का नाम कैसे बदलूंगा? उदाहरण के gdpलिए log(gdp)?

data =
    y  gdp  cap
0   1    2    5
1   2    3    9
2   8    7    2
3   3    4    7
4   6    7    7
5   4    8    3
6   8    2    8
7   9    9   10
8   6    6    4
9  10   10    7

7
वहाँ निश्चित रूप से ओवरलैप है, लेकिन मुझे तुरंत "पंडों में नाम बदलना कॉलम" से यह स्पष्ट नहीं था कि आप नाम बदलने के लिए एक एकांत स्तंभ तत्व को एकल कर सकते हैं। बेशक, पूर्वव्यापी में यह स्पष्ट है, और अगर मैंने गहरा खोदा था, तो शायद मुझे यह पता चल गया होगा, लेकिन मुझे लगता है कि यह प्रश्न / उत्तर उस बिंदु को इंगित करने में बेहतर है।
२२:०६ पर jeremiahbuddha

जवाबों:


360
data.rename(columns={'gdp':'log(gdp)'}, inplace=True)

यह renameदिखावा कि यह एक तानाशाह को एक परम के रूप में स्वीकार करता है, columnsइसलिए आप केवल एक प्रविष्टि के साथ एक तानाशाही को पारित करते हैं।

संबंधित भी देखें


3
एक बड़ी डेटाफ़्रेम पर बहुत लंबा समय लगता है, इसलिए मेरा मानना ​​है कि यह मेमोरी में पूरे डेटाफ़्रेम की नकल करने के कुछ प्रकार है?
elgehelge

1
@elgehelge यह नहीं करना चाहिए, अधिकांश पांडा ऑपरेशन एक प्रति लौटाएंगे और कुछ लोग एक inplaceपरम को स्वीकार करेंगे , अगर वह इस परम की अनदेखी कर रहा है तो यह एक बग है, क्या आप परम के साथ और उसके बिना भी समय निकाल सकते हैं, कुछ ऐसा करने की कोशिश करें new_df = df.rename(columns={'new_name':'old_name'})और देखें कि क्या यह तेज़ है या नहीं
EdChum

1
@ एडचम धन्यवाद। inplaceपरम को हटाकर 14 सेकंड से 26 सेकंड तक का समय लगभग दोगुना हो गया। लेकिन 14 सेकंड अभी भी काफी समय है सिर्फ हेडर बदलने के लिए ..
elgehelge

2
सिर्फ एक नोट, खबरदार! यदि लक्ष्य स्तंभ मौजूद नहीं है, (नाम या तो गलत वर्तनी) तो यह बिना किसी त्रुटि या चेतावनी के कुछ भी नहीं करेगा।
आमिर

1
@ क्वेश्चन यह थोड़े निराशाजनक है कि इन सरल ऑप्स में से कुछ सिर्फ लिस्ट कॉम्प्रिहेंशन करने से ज्यादा तेज क्यों हैं। मौलिक रूप से यद्यपि जब तक आपके पास बहुत बड़ा डीएफ नहीं है, तब तक यह वास्तव में तब तक नहीं होना चाहिए जब तक आप एक बड़े डीएफ पर बहुत सारे स्तंभों का नाम नहीं बदल रहे हों
एडचम

27

list-comprehensionयदि आपको किसी एकल स्तंभ का नाम बदलने की आवश्यकता है, तो बहुत तेज़ कार्यान्वयन का उपयोग करना होगा ।

df.columns = ['log(gdp)' if x=='gdp' else x for x in df.columns]

यदि आवश्यकता कई कॉलमों के नाम बदलने की होती है, तो या तो सशर्त अभिव्यक्तियों का उपयोग करें:

df.columns = ['log(gdp)' if x=='gdp' else 'cap_mod' if x=='cap' else x for x in df.columns]

या, पुराने नाम के रूप में डिफ़ॉल्ट मान सेट करके ऑपरेशन का उपयोग करके मैपिंग का निर्माण करें dictionaryऔर उसके list-comprehensionसाथ प्रदर्शन getकरें:

col_dict = {'gdp': 'log(gdp)', 'cap': 'cap_mod'}   ## key→old name, value→new name

df.columns = [col_dict.get(x, x) for x in df.columns]

समय:

%%timeit
df.rename(columns={'gdp':'log(gdp)'}, inplace=True)
10000 loops, best of 3: 168 µs per loop

%%timeit
df.columns = ['log(gdp)' if x=='gdp' else x for x in df.columns]
10000 loops, best of 3: 58.5 µs per loop

मैं इस विधि का उपयोग करने के लिए प्यार होता है, लेकिन दुर्भाग्य से यह काम नहीं करता pd.merge_asof()है, क्योंकि यह एक अभिव्यक्ति :( है।
thdoan

14

मैं पंडों में एक विशिष्ट स्तंभ का नाम कैसे बदलूं?

V0.24 + से, एक समय में एक (या अधिक) कॉलम का नाम बदलने के लिए,

  • DataFrame.rename()के साथ axis=1या axis='columns'( axisतर्क में पेश किया गया था v0.21

  • Index.str.replace() स्ट्रिंग / रेगेक्स आधारित प्रतिस्थापन के लिए।

यदि आपको एक ही बार में सभी स्तंभों का नाम बदलने की आवश्यकता है,

  • DataFrame.set_axis()के साथ विधि axis=1। सूची जैसा क्रम दें। इन-प्लेस संशोधन के लिए भी विकल्प उपलब्ध हैं।

rename साथ में axis=1

df = pd.DataFrame('x', columns=['y', 'gdp', 'cap'], index=range(5))
df

   y gdp cap
0  x   x   x
1  x   x   x
2  x   x   x
3  x   x   x
4  x   x   x

0.21+ के साथ, अब आप एक axisपैरामीटर निर्दिष्ट कर सकते हैं rename:

df.rename({'gdp':'log(gdp)'}, axis=1)
# df.rename({'gdp':'log(gdp)'}, axis='columns')
    
   y log(gdp) cap
0  x        x   x
1  x        x   x
2  x        x   x
3  x        x   x
4  x        x   x

(ध्यान दें कि renameडिफ़ॉल्ट रूप से इन-प्लेस नहीं है, इसलिए आपको परिणाम वापस असाइन करने की आवश्यकता होगी ।)

बाकी एपीआई के साथ निरंतरता को बेहतर बनाने के लिए यह जोड़ा गया है। नया axisतर्क columnsपैरामीटर के अनुरूप है -वे एक ही काम करते हैं।

df.rename(columns={'gdp': 'log(gdp)'})

   y log(gdp) cap
0  x        x   x
1  x        x   x
2  x        x   x
3  x        x   x
4  x        x   x

rename एक कॉलबैक को भी स्वीकार करता है जिसे प्रत्येक कॉलम के लिए एक बार कहा जाता है।

df.rename(lambda x: x[0], axis=1)
# df.rename(lambda x: x[0], axis='columns')

   y  g  c
0  x  x  x
1  x  x  x
2  x  x  x
3  x  x  x
4  x  x  x

इस विशिष्ट परिदृश्य के लिए, आप उपयोग करना चाहेंगे

df.rename(lambda x: 'log(gdp)' if x == 'gdp' else x, axis=1)

Index.str.replace

करने के लिए इसी तरह के replaceअजगर में तार की विधि, पांडा सूचकांक और श्रृंखला (वस्तु dtype केवल) एक ( "vectorized") को परिभाषित str.replaceस्ट्रिंग और regex आधारित प्रतिस्थापन के लिए विधि।

df.columns = df.columns.str.replace('gdp', 'log(gdp)')
df
 
   y log(gdp) cap
0  x        x   x
1  x        x   x
2  x        x   x
3  x        x   x
4  x        x   x

अन्य तरीकों पर इसका लाभ यह है कि str.replaceरेगेक्स (डिफ़ॉल्ट रूप से सक्षम) का समर्थन करता है। अधिक जानकारी के लिए डॉक्स देखें।


के set_axisसाथ एक सूची पास करनाaxis=1

set_axisहेडर की सूची के साथ कॉल करें । सूची की लंबाई कॉलम / इंडेक्स आकार के बराबर होनी चाहिए। set_axisमूल DataFrame को डिफ़ॉल्ट रूप से बदल देता है, लेकिन आप inplace=Falseएक संशोधित प्रतिलिपि वापस करने के लिए निर्दिष्ट कर सकते हैं ।

df.set_axis(['cap', 'log(gdp)', 'y'], axis=1, inplace=False)
# df.set_axis(['cap', 'log(gdp)', 'y'], axis='columns', inplace=False)

  cap log(gdp)  y
0   x        x  x
1   x        x  x
2   x        x  x
3   x        x  x
4   x        x  x

नोट: भविष्य के रिलीज़ में, inplaceडिफ़ॉल्ट रूप से होगा True

विधि जंजीर जब हम पहले से ही कॉलम निर्दिष्ट करने का एक कुशल तरीका है तो
क्यों चुनें ? जैसा कि टेड पेट्रो द्वारा दिखाया गया है [यह उत्तर], ( https://stackoverflow.com/a/46912050/4909087 ) श्रृंखला विधियों की कोशिश करते समय उपयोगी है।set_axisdf.columns = ...set_axis

तुलना

# new for pandas 0.21+
df.some_method1()
  .some_method2()
  .set_axis()
  .some_method3()

बनाम

# old way
df1 = df.some_method1()
        .some_method2()
df1.columns = columns
df1.some_method3()

पूर्व अधिक प्राकृतिक और मुक्त प्रवाह वाक्यविन्यास है।


3

पांडा में विशिष्ट कॉलम का नाम बदलने के लिए कम से कम पांच अलग-अलग तरीके हैं, और मैंने उन्हें मूल उत्तरों के लिंक के साथ नीचे सूचीबद्ध किया है। मैंने इन तरीकों को भी समय पर दिया और उन्हें उसी के बारे में प्रदर्शन करने के लिए पाया (हालांकि आपके डेटा सेट और परिदृश्य के आधार पर YMMV)। नीचे दिए गए परीक्षण का मामला कॉलम नाम बदलने के लिए है A M N Zकरने के लिए A2 M2 N2 Z2कॉलम के साथ एक dataframe में Aकरने के लिए Zएक लाख पंक्तियों से युक्त।

# Import required modules
import numpy as np
import pandas as pd
import timeit

# Create sample data
df = pd.DataFrame(np.random.randint(0,9999,size=(1000000, 26)), columns=list('ABCDEFGHIJKLMNOPQRSTUVWXYZ'))

# Standard way - https://stackoverflow.com/a/19758398/452587
def method_1():
    df_renamed = df.rename(columns={'A': 'A2', 'M': 'M2', 'N': 'N2', 'Z': 'Z2'})

# Lambda function - https://stackoverflow.com/a/16770353/452587
def method_2():
    df_renamed = df.rename(columns=lambda x: x + '2' if x in ['A', 'M', 'N', 'Z'] else x)

# Mapping function - https://stackoverflow.com/a/19758398/452587
def rename_some(x):
    if x=='A' or x=='M' or x=='N' or x=='Z':
        return x + '2'
    return x
def method_3():
    df_renamed = df.rename(columns=rename_some)

# Dictionary comprehension - https://stackoverflow.com/a/58143182/452587
def method_4():
    df_renamed = df.rename(columns={col: col + '2' for col in df.columns[
        np.asarray([i for i, col in enumerate(df.columns) if 'A' in col or 'M' in col or 'N' in col or 'Z' in col])
    ]})

# Dictionary comprehension - https://stackoverflow.com/a/38101084/452587
def method_5():
    df_renamed = df.rename(columns=dict(zip(df[['A', 'M', 'N', 'Z']], ['A2', 'M2', 'N2', 'Z2'])))

print('Method 1:', timeit.timeit(method_1, number=10))
print('Method 2:', timeit.timeit(method_2, number=10))
print('Method 3:', timeit.timeit(method_3, number=10))
print('Method 4:', timeit.timeit(method_4, number=10))
print('Method 5:', timeit.timeit(method_5, number=10))

आउटपुट:

Method 1: 3.650640267
Method 2: 3.163998427
Method 3: 2.998530871
Method 4: 2.9918436889999995
Method 5: 3.2436501520000007

अपने आवेदन में लागू करने के लिए सबसे आसान और आपके लिए सबसे आसान है कि विधि का उपयोग करें।

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