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 = new
new
yeni sütun adlarının listesi nerede olduğu kadar basittir. Bu yaklaşımın dezavantajı, mevcut veri çerçevesinin columns
niteliğ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, df
ilk 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 df
her 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.concat
kullanarak çö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
new
Listeyi sütun adları olarak eşleştirmedik . Biz tekrarlanan sona erdi y765
. Bunun yerine ,. Sütunlarını yinelerken işlevin keys
bağımsız değişkenini kullanabiliriz .pd.concat
df
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 dtype
tüm sütunlar için bir tekli varsa kullanılmalıdır . Aksi takdirde, dtype
object
tü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 transpose
ve ile dikkat çeken bir numaradır set_index
. pd.DataFrame.set_index
satır içi bir dizin belirlememize izin verir, ancak karşılık gelen yoktur set_columns
. Böylece, sonradan set_index
ve sonradan geri dönüş yapabiliriz. Bununla birlikte, çözelti 3'teki aynı tekli dtype
veya karışık dtype
uyarı 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 lambda
in 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.rename
new
x
y
x
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 y
koruyabilirim 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