Tôi có dữ liệu được lưu trong cơ sở dữ liệu postgreSQL. Tôi đang truy vấn dữ liệu này bằng Python2.7 và biến nó thành Pandas DataFrame. Tuy nhiên, cột cuối cùng của khung dữ liệu này có một từ điển (hoặc danh sách?) Các giá trị bên trong nó. DataFrame trông như thế này:
[1] df
Station ID Pollutants
8809 {"a": "46", "b": "3", "c": "12"}
8810 {"a": "36", "b": "5", "c": "8"}
8811 {"b": "2", "c": "7"}
8812 {"c": "11"}
8813 {"a": "82", "c": "15"}
Tôi cần chia cột này thành các cột riêng biệt để DataFrame trông như thế này:
[2] df2
Station ID a b c
8809 46 3 12
8810 36 5 8
8811 NaN 2 7
8812 NaN NaN 11
8813 82 NaN 15
Vấn đề chính tôi gặp phải là các danh sách không có cùng độ dài. Nhưng tất cả các danh sách chỉ chứa tối đa 3 giá trị: a, b và c. Và chúng luôn xuất hiện theo cùng một thứ tự (a thứ nhất, b giây, c thứ ba).
Đoạn mã sau được sử dụng để hoạt động và trả về chính xác những gì tôi muốn (df2).
[3] df
[4] objs = [df, pandas.DataFrame(df['Pollutant Levels'].tolist()).iloc[:, :3]]
[5] df2 = pandas.concat(objs, axis=1).drop('Pollutant Levels', axis=1)
[6] print(df2)
Tôi đã chạy mã này chỉ tuần trước và nó đã hoạt động tốt. Nhưng bây giờ mã của tôi bị hỏng và tôi gặp lỗi này từ dòng [4]:
IndexError: out-of-bounds on slice (end)
Tôi đã không thay đổi mã nhưng hiện đang nhận được lỗi. Tôi cảm thấy điều này là do phương pháp của tôi không mạnh mẽ hoặc đúng đắn.
Bất kỳ đề xuất hoặc hướng dẫn nào về cách chia cột danh sách này thành các cột riêng biệt sẽ được đánh giá cao!
EDIT: Tôi nghĩ rằng các phương thức .tolist () và .apply không hoạt động trên mã của tôi vì đó là một chuỗi unicode, tức là:
#My data format
u{'a': '1', 'b': '2', 'c': '3'}
#and not
{u'a': '1', u'b': '2', u'c': '3'}
Dữ liệu được nhập từ cơ sở dữ liệu postgreSQL ở định dạng này. Bất kỳ trợ giúp hoặc ý tưởng với vấn đề này? Có cách nào để chuyển đổi unicode?
iloc[:, :3]
giả định rằng sẽ có 3 mục và có thể các lát dữ liệu gần đây chỉ có 1 hoặc 2 (ví dụ: có xảy ra không b
giống như trong index 8813
) không?
iloc
phần