Tek hat veya Boru Hattı çözümleri
İki şeye odaklanacağım:
OP açıkça belirtiyor
Düzenlenmiş sütun adlarını bir listede sakladım, ancak sütun adlarının nasıl değiştirileceğini bilmiyorum.
'$'Her sütun üstbilgisinin ilk karakterini değiştirme veya soyma sorununu çözmek istemiyorum . OP zaten bu adımı attı. Bunun yerine columns, yedek sütun adlarının bir listesi verilen mevcut nesneyi yenisiyle değiştirmeye odaklanmak istiyorum .
df.columns = newnewyeni sütun adlarının listesi nerede olduğu kadar basittir. Bu yaklaşımın dezavantajı, mevcut veri çerçevesinin columnsniteliğini düzenlemeyi gerektirmesi ve satır içinde yapılmamasıdır. Mevcut veri çerçevesini düzenlemeden bunu boru hattıyla gerçekleştirmenin birkaç yolunu göstereceğim.
Kurulum 1
Sütun adlarını önceden var olan bir listeyle değiştirmenin yeniden adlandırılması ihtiyacına odaklanmak için, dfilk sütun adlarını ve ilgisiz yeni sütun adlarını içeren yeni bir örnek veri çerçevesi oluşturacağım .
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
Çözüm 1
pd.DataFrame.rename
Eski sütun adlarını yeni sütun adlarıyla eşleştiren bir sözlüğünüz varsa, kullanabileceğiniz zaten söylenmiştir 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
Ancak sözlüğü kolayca oluşturabilir ve çağrısına ekleyebilirsiniz rename. Aşağıdakiler, yineleme yaparken dfher sütun adı üzerinde yineleme yaptığımız gerçeğinden yararlanır .
# 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
Orijinal sütun adlarınız benzersizse bu harika çalışır. Ama eğer değillerse, o zaman bu yıkılır.
Benzersiz olmayan 2 sütun ayarlama
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
2. argümanı
pd.concatkullanarak çözümkeys
İlk olarak, çözüm 1'i kullanmaya çalıştığımızda ne olduğuna dikkat edin:
df.rename(columns=dict(zip(df, new)))
y765 y765 z432
0 1 3 5
1 2 4 6
newListeyi sütun adları olarak eşleştirmedik . Biz tekrarlanan sona erdi y765. Bunun yerine ,. Sütunlarını yinelerken işlevin keysbağımsız değişkenini kullanabiliriz .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
Çözüm 3
Rekonstrüksiyon. Bu, yalnızca dtypetüm sütunlar için bir tekli varsa kullanılmalıdır . Aksi takdirde, dtype objecttüm sütunlar için sonuçlanır ve bunları geri dönüştürmek daha fazla sözlük çalışması gerektirir.
Tek dtype
pd.DataFrame(df.values, df.index, new)
x098 y765 z432
0 1 3 5
1 2 4 6
Karışık 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
Çözüm 4
Bu transposeve ile dikkat çeken bir numaradır set_index. pd.DataFrame.set_indexsatır içi bir dizin belirlememize izin verir, ancak karşılık gelen yoktur set_columns. Böylece, sonradan set_indexve sonradan geri dönüş yapabiliriz. Bununla birlikte, çözelti 3'teki aynı tekli dtypeveya karışık dtypeuyarı burada geçerlidir.
Tek dtype
df.T.set_index(np.asarray(new)).T
x098 y765 z432
0 1 3 5
1 2 4 6
Karışık 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
Çözüm 5 Her bir elementin içinden geçen
bir lambdain kullanın
. Bu çözümde, onu alan ancak görmezden gelen bir lambda geçiririz. Ayrıca alır ama beklemiyor. Bunun yerine, bir yineleyici varsayılan bir değer olarak verilir ve daha sonra değeri ne olursa olsun bir seferde bir geçiş yapmak için kullanabilirsiniz .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
Ve bana sopython sohbetinde millet tarafından işaret edildiği gibi *, arasına bir ek eklersemx ve değişkenimi ykoruyabilirim y. Yine de, bu bağlamda korunmaya ihtiyacı olduğuna inanmıyorum. Hala bahsetmeye değer.
df.rename(columns=lambda x, *, y=iter(new): next(y))
x098 y765 z432
0 1 3 5
1 2 4 6