Chuyển đổi cột thành chuỗi trong Pandas


178

Tôi có DataFrame sau từ truy vấn SQL:

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

và tôi muốn xoay nó như thế này:

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}

nhưng tôi muốn chắc chắn rằng các cột 303 được đúc thành chuỗi thay vì số nguyên để tôi có được điều này:

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

Câu trả lời:


331

Một cách để chuyển đổi thành chuỗi là sử dụng astype :

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

Tuy nhiên, có lẽ bạn đang tìm kiếm to_jsonchức năng, nó sẽ chuyển đổi các khóa thành json hợp lệ (và do đó các khóa của bạn thành chuỗi):

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"}'

Lưu ý: bạn có thể chuyển vào bộ đệm / tệp để lưu tệp này cùng với một số tùy chọn khác ...


3
Tôi nghĩ to_opes () thích hợp hơn do việc bảo quản NULLs stackoverflow.com/a/44008334/3647167
Keith

1
@Keith null bảo quản là hấp dẫn. nhưng tài liệu nói rằng mục đích của nó là 'Kết xuất DataFrame thành đầu ra dạng bảng thân thiện với bàn điều khiển'. Tôi muốn một người có thẩm quyền cân nhắc
3pitt

to_json()có lẽ không gọi astype(str)vì nó rời datetime64 và các lớp con của nó là mili giây kể từ epoch.
Sussch

1
@Sussch Tôi nghi ngờ đó là vì json không có định dạng thời gian rõ ràng, vì vậy bạn buộc phải sử dụng epoch. Có thể nói, tôi nghĩ đó là tiêu chuẩn.
Andy Hayden

48

Nếu bạn cần chuyển đổi TẤT CẢ các cột thành chuỗi, bạn chỉ cần sử dụng:

df = df.astype(str)

Điều này hữu ích nếu bạn cần mọi thứ trừ một vài cột là chuỗi / đối tượng, sau đó quay lại và chuyển đổi các cột khác thành bất cứ thứ gì bạn cần (số nguyên trong trường hợp này):

 df[["D", "E"]] = df[["D", "E"]].astype(int) 

28

Đây là một cột khác, đặc biệt hữu ích để chuyển đổi nhiều cột thành chuỗi thay vì chỉ một cột:

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


0

Sử dụng .apply()với lambdachức năng chuyển đổi cũng hoạt động trong trường hợp này:

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

Đối với toàn bộ datafram bạn có thể sử dụng .applymap(). (nhưng trong mọi trường hợp có thể .astype()nhanh hơn)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.