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.