Jak mogę zmienić nagłówki kolumn Dataframe pandas na małe litery?

101

Chcę, aby wszystkie nagłówki kolumn w moich ramkach danych pandy były małymi literami

Przykład

Jeśli mam:

data =

  country country isocode  year     XRAT          tcgdp
0  Canada             CAN  2001  1.54876   924909.44207
1  Canada             CAN  2002  1.56932   957299.91586
2  Canada             CAN  2003  1.40105  1016902.00180
....

Chciałbym zmienić XRAT na xrat, wykonując coś takiego:

data.headers.lowercase()

Tak więc otrzymuję:

  country country isocode  year     xrat          tcgdp
0  Canada             CAN  2001  1.54876   924909.44207
1  Canada             CAN  2002  1.56932   957299.91586
2  Canada             CAN  2003  1.40105  1016902.00180
3  Canada             CAN  2004  1.30102  1096000.35500
....

Nie będę z wyprzedzeniem znać nazw poszczególnych nagłówków kolumn.

natsuki_2002
źródło
11
Łatwiejdf.columns = df.columns.str.lower()
Alex Montoya

Odpowiedzi:

185

Możesz to zrobić w ten sposób:

data.columns = map(str.lower, data.columns)

lub

data.columns = [x.lower() for x in data.columns]

przykład:

>>> data = pd.DataFrame({'A':range(3), 'B':range(3,0,-1), 'C':list('abc')})
>>> data
   A  B  C
0  0  3  a
1  1  2  b
2  2  1  c
>>> data.columns = map(str.lower, data.columns)
>>> data
   a  b  c
0  0  3  a
1  1  2  b
2  2  1  c
Roman Pekar
źródło
7
Zauważ, że może to prowadzić do zduplikowanych nazw kolumn, gdy niższe (kolumna1) == niższe (kolumna2) (np. „A” i „A”). Może to mieć niezamierzone konsekwencje podczas późniejszego odwoływania się do kolumn. (np. data [„a”] zwróci ramkę danych, a nie serię, ze wszystkimi kolumnami nazwanymi „a”). Zobacz ten przykład dla przykładu: gist.github.com/grisaitis/170e82a008480acb4fa3
grisaitis
1
[x.lower() for x in data.columns]jest odpowiednikiem:[x.lower() for x in data]
joctee
[x.lower().strip() for x in df0]
Paweł Kranzberg
@PawelKranzberg Czy masz jakiś pomysł, jak obniżyć nazwy kolumnMultiIndex
curious_nustian
1
@curious_nustian - Tak, np .:df.index.names = [x.lower().strip() for x in df.index.names]
Paweł Kranzberg
103

Można to zrobić łatwo str.lowerza columns:

df.columns = df.columns.str.lower()

Przykład:

In [63]: df
Out[63]: 
  country country isocode  year     XRAT         tcgdp
0  Canada             CAN  2001  1.54876  9.249094e+05
1  Canada             CAN  2002  1.56932  9.572999e+05
2  Canada             CAN  2003  1.40105  1.016902e+06

In [64]: df.columns = df.columns.str.lower()

In [65]: df
Out[65]: 
  country country isocode  year     xrat         tcgdp
0  Canada             CAN  2001  1.54876  9.249094e+05
1  Canada             CAN  2002  1.56932  9.572999e+05
2  Canada             CAN  2003  1.40105  1.016902e+06
Anton Protopopov
źródło
21

Jeśli chcesz zmienić nazwę przy użyciu połączonego wywołania metody, możesz użyć

data.rename(
    columns=unicode.lower
)

(Python 2)

lub

data.rename(
    columns=str.lower
)

(Python 3)

teister
źródło
1
df.columns = df.columns.str.lower()

jest najłatwiejszy, ale wyświetli błąd, jeśli niektóre nagłówki są numeryczne

jeśli masz nagłówki numeryczne, użyj tego:

df.columns = [str(x).lower() for x in df.columns]
Cierń Fouad
źródło
1
Myślę, że df.columns.astype(str).str.lower()w takim przypadku łatwiej jest pisać , ale może trochę rozwlekle.
Anton Protopopov
To dobra sugestia!
Chadee Fouad
0

Oto prosty sposób: data.columns = data.columns.str.lower()

AnksG
źródło
Spowoduje to błąd, jeśli pole jest numeryczne
Chadee Fouad