एक पंक्ति या पाइपलाइन समाधान
मैं दो चीजों पर ध्यान केंद्रित करूंगा:
ओपी स्पष्ट रूप से बताता है
मेरे पास संपादित स्तंभ नाम एक सूची में संग्रहीत हैं, लेकिन मुझे नहीं पता कि स्तंभ नामों को कैसे बदला जाए।
मैं इस समस्या को हल नहीं करना चाहता कि '$'प्रत्येक कॉलम हेडर के पहले वर्ण को कैसे बदलें या स्ट्रिप करें। ओपी पहले ही यह कदम उठा चुका है। इसके बजाय मैं मौजूदा columnsकॉलम को बदलने वाले कॉलम नामों की एक सूची के साथ मौजूदा ऑब्जेक्ट को बदलने पर ध्यान केंद्रित करना चाहता हूं ।
df.columns = newnewनए कॉलम के नामों की सूची जहां है, वह उतना ही सरल है जितना कि यह मिलता है। इस दृष्टिकोण का दोष यह है कि इसे मौजूदा डेटाफ्रेम की columnsविशेषता को संपादित करने की आवश्यकता है और यह इनलाइन नहीं किया गया है। मैं मौजूदा डेटाफ़्रेम को संपादित किए बिना पाइपलाइनिंग के माध्यम से इसे प्रदर्शित करने के कुछ तरीके दिखाऊंगा।
सेटअप 1
पहले से मौजूद सूची के साथ कॉलम नामों को बदलने का नाम बदलने की आवश्यकता पर ध्यान केंद्रित करने के लिए, मैं dfप्रारंभिक कॉलम नामों और असंबंधित नए कॉलम नामों के साथ एक नया नमूना डेटाफ़्रेम बनाऊंगा ।
df = pd.DataFrame({'Jack': [1, 2], 'Mahesh': [3, 4], 'Xin': [5, 6]})
new = ['x098', 'y765', 'z432']
df
Jack Mahesh Xin
0 1 3 5
1 2 4 6
समाधान 1
pd.DataFrame.rename
यह पहले ही कहा जा चुका है यदि आपके पास पुराने कॉलम के नामों को नए कॉलम नामों में मैप करने की सुविधा है, तो आप इसका उपयोग कर सकते हैं pd.DataFrame.rename।
d = {'Jack': 'x098', 'Mahesh': 'y765', 'Xin': 'z432'}
df.rename(columns=d)
x098 y765 z432
0 1 3 5
1 2 4 6
हालाँकि, आप आसानी से उस शब्दकोश को बना सकते हैं और उसे कॉल में शामिल कर सकते हैं rename । निम्नलिखित इस तथ्य का लाभ उठाता है कि जब पुनरावृत्ति होती है df, तो हम प्रत्येक स्तंभ नाम पर पुनरावृति करते हैं।
# given just a list of new column names
df.rename(columns=dict(zip(df, new)))
x098 y765 z432
0 1 3 5
1 2 4 6
यदि आपके मूल स्तंभ नाम अद्वितीय हैं, तो यह बहुत अच्छा है। लेकिन अगर वे नहीं हैं, तो यह टूट जाता है।
सेटअप 2
गैर-अद्वितीय स्तंभ
df = pd.DataFrame(
[[1, 3, 5], [2, 4, 6]],
columns=['Mahesh', 'Mahesh', 'Xin']
)
new = ['x098', 'y765', 'z432']
df
Mahesh Mahesh Xin
0 1 3 5
1 2 4 6
समाधान २
pd.concat का उपयोग करkeys तर्क हुए
पहले, ध्यान दें कि जब हम समाधान 1 का उपयोग करने का प्रयास करते हैं तो क्या होता है:
df.rename(columns=dict(zip(df, new)))
y765 y765 z432
0 1 3 5
1 2 4 6
हमने newसूची को स्तंभ नामों के रूप में मैप नहीं किया । हमने दोहराना समाप्त कर दिया y765। इसके बजाय, हम कॉलम के माध्यम से पुनरावृत्ति करते हुए फ़ंक्शन के keysतर्क का उपयोग कर सकते हैं ।pd.concatdf
pd.concat([c for _, c in df.items()], axis=1, keys=new)
x098 y765 z432
0 1 3 5
1 2 4 6
समाधान 3
पुनर्निर्माण। इसका उपयोग केवल तभी किया जाना चाहिए जब आपके पास dtypeसभी स्तंभों के लिए एक एकल हो । अन्यथा, आप समाप्त करेंगेdtype object सभी स्तंभों के और उन्हें वापस परिवर्तित करने के लिए अधिक शब्दकोश कार्य की आवश्यकता होगी।
एक dtype
pd.DataFrame(df.values, df.index, new)
x098 y765 z432
0 1 3 5
1 2 4 6
मिश्रित dtype
pd.DataFrame(df.values, df.index, new).astype(dict(zip(new, df.dtypes)))
x098 y765 z432
0 1 3 5
1 2 4 6
समाधान 4
इस के साथ एक तिकड़मी चाल है transposeऔर set_index। pd.DataFrame.set_indexहमें एक सूचकांक इनलाइन सेट करने की अनुमति देता है, लेकिन कोई संगत नहीं है set_columns। तो हम संक्रमण कर सकते हैं, फिरset_index , और वापस हैं। हालांकि, एक ही एकल dtypeबनाम मिश्रितdtype समाधान 3 से कैविट यहां लागू होता है।
एक dtype
df.T.set_index(np.asarray(new)).T
x098 y765 z432
0 1 3 5
1 2 4 6
मिश्रित dtype
df.T.set_index(np.asarray(new)).T.astype(dict(zip(new, df.dtypes)))
x098 y765 z432
0 1 3 5
1 2 4 6
समाधान 5 प्रत्येक तत्व के माध्यम से उस चक्र में
एक lambdaका उपयोग करें
। इस समाधान में, हम एक लैम्ब्डा पास करते हैं जो लेता है लेकिन फिर इसे अनदेखा करता है। यह भी लगता है, लेकिन यह उम्मीद नहीं है। इसके बजाय, एक पुनरावृत्त को एक डिफ़ॉल्ट मान के रूप में दिया जाता है और फिर मैं इसका उपयोग उस मूल्य के संबंध में बिना किसी समय के एक चक्र के माध्यम से कर सकता हूं ।pd.DataFrame.renamenew
xyx
df.rename(columns=lambda x, y=iter(new): next(y))
x098 y765 z432
0 1 3 5
1 2 4 6
और जैसा कि मैंने sopython चैट में लोगों द्वारा बताया है , अगर मैं *बीच में एक जोड़ देता हूं xऔर y, मैं अपने yचर की रक्षा कर सकता हूं । हालाँकि, इस संदर्भ में मुझे विश्वास नहीं है कि इसे सुरक्षा की आवश्यकता है। यह अभी भी ध्यान देने योग्य है।
df.rename(columns=lambda x, *, y=iter(new): next(y))
x098 y765 z432
0 1 3 5
1 2 4 6