Benim data
adında bir veri çerçevem var. Sadece bir sütun başlığını nasıl yeniden adlandırabilirim? Örneğin gdp
yi log(gdp)
olarak mı?
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
data.rename(columns={'gdp':'log(gdp)'}, inplace=True)
rename
](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.rename.html#pandas.DataFrame.rename) columns
için bir parametre olarak bir dict kabul ettiğini gösterir, böylece sadece tek bir girdi ile bir dict geçirirsiniz.
Ayrıca bakınız ilgili
Tek bir sütunu yeniden adlandırmanız gerekiyorsa list-comprehension
kullanmak çok daha hızlı bir uygulama olacaktır.
df.columns = ['log(gdp)' if x=='gdp' else x for x in df.columns]
Birden fazla sütunun yeniden adlandırılması gerekiyorsa, aşağıdaki gibi koşullu ifadeler kullanın:
df.columns = ['log(gdp)' if x=='gdp' else 'cap_mod' if x=='cap' else x for x in df.columns]
Ya da, bir sözlük
kullanarak bir eşleme oluşturun ve varsayılan değeri eski ad olarak ayarlayarak list-comprehension
işlemini get
işlemi ile gerçekleştirin:
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]
Zamanlamalar:
%%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
Pandas'ta belirli bir sütunu nasıl yeniden adlandırabilirim?
v0.24+ sürümünden itibaren, bir seferde bir (veya daha fazla) sütunu yeniden adlandırmak için,
DataFrame.rename()
ile axis=1
veya axis='columns'
** (axis
bağımsız değişkeni v0.21
de tanıtılmıştır.
Dize/regex tabanlı değiştirme için Index.str.replace()
.
TÜM sütunları bir kerede yeniden adlandırmanız gerekiyorsa,
DataFrame.set_axis()
yöntemi ile axis=1
. Liste benzeri bir dizi iletir. Yerinde değişiklik için de seçenekler mevcuttur.eksen=1
ile yeniden adlandır
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+ ile artık rename
ile bir axis
parametresi belirtebilirsiniz:
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'in varsayılan olarak yerinde olmadığını unutmayın, bu nedenle sonucu geri atamanız gerekecektir).
Bu ekleme API'nin geri kalanıyla tutarlılığı artırmak için yapılmıştır. Yeni axis
bağımsız değişkeni columns
parametresine benzer - aynı şeyi yaparlar.
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` ayrıca her sütun için bir kez çağrılan bir geri çağırma kabul eder.
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
Bu özel senaryo için şunları kullanmak istersiniz
df.rename(lambda x: 'log(gdp)' if x == 'gdp' else x, axis=1)
Index.str.replace
Python'daki dizelerin replace
yöntemine benzer şekilde, pandas Index ve Series (yalnızca nesne türü), dize ve regex tabanlı değiştirme için bir ("vectorized") str.replace
yöntemi tanımlar.
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
Bunun diğer yöntemlere göre avantajı str.replace
in regex'i desteklemesidir (varsayılan olarak etkin). Daha fazla bilgi için dokümanlara bakın.
set_axis
öğesine axis=1
ile bir liste geçirmeSet_axisi bir başlık(lar) listesi ile çağırın. Liste, sütun/indeks boyutuna eşit uzunlukta olmalıdır. set_axis
varsayılan olarak orijinal DataFramei değiştirir, ancak değiştirilmiş bir kopya döndürmek için
inplace=False` belirtebilirsiniz.
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
Not: Gelecek sürümlerde, inplace
varsayılan olarak True
olacaktır.
Metot Zincirleme
Sütunları atamak için df.columns = ...
ile zaten etkili bir yolumuz varken neden set_axis
seçelim? Ted Petrou tarafından [bu yanıtta] gösterildiği gibi, (https://stackoverflow.com/a/46912050/4909087) set_axis
yöntemleri zincirlemeye çalışırken kullanışlıdır.
Karşılaştırın
# new for pandas 0.21+
df.some_method1()
.some_method2()
.set_axis()
.some_method3()
Versus
# old way
df1 = df.some_method1()
.some_method2()
df1.columns = columns
df1.some_method3()
İlki daha doğal ve serbest akan bir sözdizimidir.