Jak dodać przyrostek (lub przedrostek) do każdej nazwy kolumny?


88

Chcę dodać _xsufiks do każdej nazwy kolumny w następujący sposób:

featuresA = myPandasDataFrame.columns.values + '_x'

Jak mam to zrobic? Dodatkowo, gdybym chciał dodać x_jako przyrostek, jak zmieniłoby się rozwiązanie?

Odpowiedzi:


120

Możesz użyć listzrozumienia:

df.columns = [str(col) + '_x' for col in df.columns]

Istnieją również wbudowane metody, takie jak .add_suffix()i .add_prefix()jak wspomniano w innej odpowiedzi.


to najbardziej uproszczona i elegancka odpowiedź!
Jinhua Wang

163

Moim zdaniem najładniejszy sposób dodania sufiksu jest następujący.

df = df.add_suffix('_some_suffix')

Ponieważ jest to funkcja, która jest wywoływana w DataFrame i zwraca DataFrame - możesz jej użyć w łańcuchu wywołań.


14
Możesz użyć add_prefix, jeśli chcesz dodać przedrostek do nazw.
Jorge

9
Szkoda, że ​​nie można tego zmienić (tj. Nie ma inplace=Trueopcji parametru). W przeciwnym razie idealnie.
Ijoseph

Myślę, że w niektórych okolicznościach jest to lepsze niż akceptowana odpowiedź, ponieważ można jej użyć w łańcuchu operacji w pojedynczym oświadczeniu, zamiast potrzebować własnego oświadczenia.
Kapitan Lepton,

@CaptainLepton gdy nie będzie to odpowiedź byłaby lepsza niż Zaakceptowanych odpowiedź
Baxx

1
Jeśli przyrostek nie jest stałą. Tytuł mówi o przyrostkach. Post zawęża zakres do pojedynczego stałego sufiksu, ale jeśli odpowiadamy na tytuł posta w kategoriach ogólnych, ustawienie kolumn za pomocą rozumienia listy lub innej iterowalnej jest bardziej elastyczne
Kapitan Lepton

17

Elegancka konkatenacja lokalna

Jeśli próbujesz modyfikować dfw miejscu, najtańszą (i najprostszą) opcją jest dodawanie na miejscu bezpośrednio df.columns(tj. Używanie Index.__iadd__).

df = pd.DataFrame({"A": [9, 4, 2, 1], "B": [12, 7, 5, 4]})
df

   A   B
0  9  12
1  4   7
2  2   5
3  1   4

df.columns += '_some_suffix'
df

   A_some_suffix  B_some_suffix
0              9             12
1              4              7
2              2              5
3              1              4

Aby dodać przedrostek, użyj podobnie

df.columns = 'some_prefix_' + df.columns
df

   some_prefix_A  some_prefix_B
0              9             12
1              4              7
2              2              5
3              1              4

Inną tanią opcją jest użycie list składanych z f-stringformatowaniem (dostępne na python3.6 +).

df.columns = [f'{c}_some_suffix' for c in df]
df

   A_some_suffix  B_some_suffix
0              9             12
1              4              7
2              2              5
3              1              4

Podobnie w przypadku przedrostka

df.columns = [f'some_prefix{c}' for c in df]

Metoda łączenia

Możliwe jest również dodawanie * poprawek podczas łączenia metod. Aby dodać sufiks, użyjDataFrame.add_suffix

df.add_suffix('_some_suffix')

   A_some_suffix  B_some_suffix
0              9             12
1              4              7
2              2              5
3              1              4

To zwraca kopię danych. IOW, dfnie jest modyfikowany.

Dodanie przedrostków również odbywa się za pomocą DataFrame.add_prefix.

df.add_prefix('some_prefix_')

   some_prefix_A  some_prefix_B
0              9             12
1              4              7
2              2              5
3              1              4

Co również nie zmienia df.


Krytyka add_*fix

Są to dobre metody, jeśli próbujesz wykonać łańcuch metod:

df.some_method1().some_method2().add_*fix(...)

Jednak add_prefix(i add_suffix) tworzy kopię całej ramki danych, tylko po to, aby zmodyfikować nagłówki. Jeśli uważasz, że to marnotrawstwo, ale nadal chcesz łączyć się w sieć, możesz zadzwonić pipe:

def add_suffix(df):
    df.columns += '_some_suffix'
    return df

df.some_method1().some_method2().pipe(add_suffix)

To jest eleganckie! A co jeśli chcesz dodać przedrostek lub przyrostek do podzbioru kolumn, np. Kolumn, których wszystkie nazwy zawierają wspólne słowo (jak newlub old) zamiast wszystkich kolumn? Dzięki.
Bowen Liu

1
@BowenLiu Sugerowałbym zamiast tego iść z df.rename () ... Przekaż słownik mapujący nazwy na ich nowe nazwy. Następnie wywołaj zmianę nazwy z osią = 1. Możesz również użyć warunkowego przypisania do listy.
cs95

Działa tylko ze zwykłymi typami danych jako nazwami kolumn, a nie jeśli kolumny są RangeIndexem, jak na przykład df = pd.DataFrame([[1,2,3]]*10)-> df.columns, wtedy użyjeszdf.add_suffix('_x')
Lorenz

możesz zrobić, df.columns = df.columns.astype(str) + '_x' jak pokazuje moja pierwsza metoda.
cs95

4

Nie widziałem tego rozwiązania zaproponowanego powyżej, więc dodaj to do listy:

df.columns += '_x'

I możesz łatwo dostosować się do scenariusza przedrostka.


Najlepsze rozwiązanie dla przyrostka, choć oczywiście nie można go używać jako przedrostka.
Lorenz

Działa tylko ze zwykłymi typami danych w nazwach kolumn, a nie jeśli kolumny są RangeIndex, jak na przykład df = pd.DataFrame([[1,2,3]]*10)-> df.columns, wtedy użyjeszdf.add_suffix('_x')
Lorenz

1

Znam 4 sposoby dodawania sufiksu (lub prefiksu) do nazw kolumn:

1- df.columns = [str(col) + '_some_suffix' for col in df.columns]

lub

2- df.rename(columns= lambda col: col+'_some_suffix')

lub

3- df.columns += '_some_suffix'dużo łatwiejsze.

lub najmilszy:

3- df.add_suffix('_some_suffix')


0

Korzystanie DataFrame.rename.

Wycofanie add_prefixiadd_suffix

W przyszłych wersjach pand add_prefixi add_suffixzostaną wycofane . Nowa zalecana metoda polega na zastosowaniu DataFrame.rename:

df = pd.DataFrame({'A': range(3), 'B': range(4, 7)})
print(df)
   A  B
0  0  4
1  1  5
2  2  6

Korzystanie renamez axis=1i formatowanie ciąg:

df.rename('col_{}'.format, axis=1)
# or df.rename(columns='col_{}'.format)

   col_A  col_B
0      0      4
1      1      5
2      2      6

Aby faktycznie nadpisać nazwy kolumn, możemy przypisać zwrócone wartości do df:

df = df.rename('col_{}'.format, axis=1)

lub użyj inplace=True:

df.rename('col_{}'.format, axis=1, inplace=True)
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.