Tôi nghĩ rằng hoạt động bạn đang sau - để UNPIVOT một bảng - được gọi là "tan chảy". Trong trường hợp này, phần cứng có thể được thực hiện bằng cách pd.melt
, và mọi thứ khác về cơ bản là đổi tên và sắp xếp lại:
df = pd.DataFrame(sample).reset_index().rename(columns={"index": "item"})
df = pd.melt(df, "item", var_name="user").dropna()
df = df[["user", "item", "value"]].reset_index(drop=True)
Đơn giản chỉ cần gọi DataFrame
sản xuất cái gì đó mà có các thông tin chúng tôi muốn nhưng có hình dạng sai:
>>> df = pd.DataFrame(sample)
>>> df
user1 user2 user3
item1 2.5 2.5 NaN
item2 3.5 3.0 4.5
item3 3.0 3.5 NaN
item4 3.5 4.0 NaN
item5 2.5 NaN 1.0
item6 3.0 NaN 4.0
Vì vậy, hãy thúc đẩy chỉ số cho một cột thực và cải thiện tên:
>>> df = pd.DataFrame(sample).reset_index().rename(columns={"index": "item"})
>>> df
item user1 user2 user3
0 item1 2.5 2.5 NaN
1 item2 3.5 3.0 4.5
2 item3 3.0 3.5 NaN
3 item4 3.5 4.0 NaN
4 item5 2.5 NaN 1.0
5 item6 3.0 NaN 4.0
Sau đó, chúng tôi có thể gọi pd.melt
để chuyển các cột. Nếu chúng ta không chỉ định tên biến mà chúng ta muốn, "người dùng", nó sẽ cho nó tên nhàm chán của "biến" (giống như nó cung cấp cho chính dữ liệu tên "giá trị" nhàm chán).
>>> df = pd.melt(df, "item", var_name="user").dropna()
>>> df
item user value
0 item1 user1 2.5
1 item2 user1 3.5
2 item3 user1 3.0
3 item4 user1 3.5
4 item5 user1 2.5
5 item6 user1 3.0
6 item1 user2 2.5
7 item2 user2 3.0
8 item3 user2 3.5
9 item4 user2 4.0
13 item2 user3 4.5
16 item5 user3 1.0
17 item6 user3 4.0
Cuối cùng, chúng ta có thể sắp xếp lại và ghi số lại các chỉ số:
>>> df = df[["user", "item", "value"]].reset_index(drop=True)
>>> df
user item value
0 user1 item1 2.5
1 user1 item2 3.5
2 user1 item3 3.0
3 user1 item4 3.5
4 user1 item5 2.5
5 user1 item6 3.0
6 user2 item1 2.5
7 user2 item2 3.0
8 user2 item3 3.5
9 user2 item4 4.0
10 user3 item2 4.5
11 user3 item5 1.0
12 user3 item6 4.0
melt
là khá hữu ích khi bạn đã quen với nó. Thông thường, như ở đây, bạn làm một số đổi tên/sắp xếp lại trước và sau.
Tuyệt vời. Cảm ơn :) – Godel
Tuyệt vời, Nhưng làm thế nào để phản đối nhiệm vụ. tức là nếu dataframe được cung cấp cách chuyển đổi nó thành từ điển. Ngoài ra, nếu cột được bỏ ngẫu nhiên. – SujitS
@BlackRabbitt, Sử dụng dict mặc định 'từ bộ sưu tập import defaultdict; d = defaultdict (dict); đối với người dùng, mục, giá trị trong df.values: d.setdefault (người dùng, {}) [item] = value' – falsetru