Konwertuj kolumny na ciąg w pandach

179

Mam następującą ramkę DataFrame z zapytania SQL:

(Pdb) pp total_rows
     ColumnID  RespondentCount
0          -1                2
1  3030096843                1
2  3030096845                1

i chcę to obrócić w ten sposób:

total_data = total_rows.pivot_table(cols=['ColumnID'])

(Pdb) pp total_data
ColumnID         -1            3030096843   3030096845
RespondentCount            2            1            1

[1 rows x 3 columns]


total_rows.pivot_table(cols=['ColumnID']).to_dict('records')[0]

{3030096843: 1, 3030096845: 1, -1: 2}

ale chcę się upewnić, że kolumny 303 są rzutowane jako ciągi zamiast liczb całkowitych, aby uzyskać to:

{'3030096843': 1, '3030096845': 1, -1: 2}
sontek
źródło

Odpowiedzi:

332

Jednym ze sposobów konwersji na ciąg jest użycie astype :

total_rows['ColumnID'] = total_rows['ColumnID'].astype(str)

Być może jednak szukasz to_jsonfunkcji, która przekonwertuje klucze na prawidłowe json (a tym samym twoje klucze na ciągi):

In [11]: df = pd.DataFrame([['A', 2], ['A', 4], ['B', 6]])

In [12]: df.to_json()
Out[12]: '{"0":{"0":"A","1":"A","2":"B"},"1":{"0":2,"1":4,"2":6}}'

In [13]: df[0].to_json()
Out[13]: '{"0":"A","1":"A","2":"B"}'

Uwaga: możesz przekazać bufor / plik, aby to zapisać, wraz z kilkoma innymi opcjami ...

Andy Hayden
źródło
3
Myślę, że to_string () jest lepsze ze względu na zachowanie wartości NULL stackoverflow.com/a/44008334/3647167
Keith
1
@Keith zerowe zachowanie jest atrakcyjne. ale dokument mówi, że jego celem jest „Renderowanie DataFrame do tabelarycznego wyniku przyjaznego dla konsoli”. Chciałbym, żeby ktoś autorytatywny ważył
3pitt,
to_json()prawdopodobnie nie wywołuje, astype(str)gdy opuszcza datetime64 i jego podklasy jako milisekundy od epoki.
Sussch,
1
@Sussch Podejrzewam, że to dlatego, że json nie ma jawnego formatu daty i godziny, więc jesteś zmuszony do używania epoki. To znaczy, myślę, że to standard.
Andy Hayden,
49

Jeśli chcesz przekonwertować WSZYSTKIE kolumny na ciągi, możesz po prostu użyć:

df = df.astype(str)

Jest to przydatne, jeśli potrzebujesz wszystkiego oprócz kilku kolumn jako łańcuchów / obiektów, a następnie wróć i przekonwertuj pozostałe na cokolwiek potrzebujesz (w tym przypadku liczbę całkowitą):

 df[["D", "E"]] = df[["D", "E"]].astype(int) 
Mikrofon
źródło
28

Oto druga, szczególnie przydatna do konwersji wielu kolumn na ciąg znaków zamiast pojedynczej kolumny:

In [76]: import numpy as np
In [77]: import pandas as pd
In [78]: df = pd.DataFrame({
    ...:     'A': [20, 30.0, np.nan],
    ...:     'B': ["a45a", "a3", "b1"],
    ...:     'C': [10, 5, np.nan]})
    ...: 

In [79]: df.dtypes ## Current datatype
Out[79]: 
A    float64
B     object
C    float64
dtype: object

## Multiple columns string conversion
In [80]: df[["A", "C"]] = df[["A", "C"]].astype(str) 

In [81]: df.dtypes ## Updated datatype after string conversion
Out[81]: 
A    object
B    object
C    object
dtype: object
Surya
źródło
3

Użyj .astype (str)

Dawny:

Niech d będzie ramką danych Pandas

d['Column_name'].astype(str)

Kranthi Kumar Valaboju
źródło
0

Używanie .apply()z lambdafunkcją konwersji działa również w tym przypadku:

total_rows['ColumnID'] = total_rows['ColumnID'].apply(lambda x: str(x))

Dla całych ramek danych możesz użyć .applymap(). (ale w każdym razie prawdopodobnie .astype()jest szybszy)

dbouz
źródło