1) phương pháp bắt buộc:
Một thực hiện nhanh hơn sẽ là để sắp xếp các giá trị của dataframe và sắp xếp các cột phù hợp dựa trên nó sẽ được lấy chỉ số sau np.argsort
.
pd.DataFrame(df.columns[np.argsort(df.values)], df.index, np.unique(df.values))
Áp dụng np.argsort
cho chúng ta dữ liệu chúng tôi đang tìm kiếm:
df.columns[np.argsort(df.values)]
Out[156]:
Index([['a1', 'a2', 'a3', 'a4'], ['a3', 'a1', 'a2', 'a4'],
['a4', 'a2', 'a3', 'a1']],
dtype='object')
2) cách tiếp cận tổng quát chậm:
Cách tiếp cận tổng quát hơn trong khi với chi phí của một số tốc độ/hiệu quả sẽ là sử dụng apply
sau khi tạo ánh xạ của các chuỗi/giá trị có trong khung dữ liệu có tên cột tương ứng của chúng.
Sử dụng trình tạo khung dữ liệu sau này sau khi chuyển đổi chuỗi đã thu được thành biểu diễn list
của chúng.
pd.DataFrame(df.apply(lambda s: dict(zip(pd.Series(s), pd.Series(s).index)), 1).tolist())
3) cách tiếp cận nhanh hơn tổng quát:
Sau khi có một danh sách các từ điển từ df.to_dict
+ orient='records'
, chúng ta cần phải trao đổi nó quan trọng và giá trị tương ứng của cặp trong khi iterating qua chúng trong một vòng lặp.
pd.DataFrame([{val:key for key, val in d.items()} for d in df.to_dict('r')])
trường hợp thử nghiệm mẫu:
df = df.assign(a5=['Foo', 'Bar', 'Baz'])
Cả hai phương pháp sản xuất:
@piRSquared EDIT
giải pháp tổng quát
def nic(df):
v = df.values
n, m = v.shape
u, inv = np.unique(v, return_inverse=1)
i = df.index.values
c = df.columns.values
r = np.empty((n, len(u)), dtype=c.dtype)
r[i.repeat(m), inv] = np.tile(c, n)
return pd.DataFrame(r, i, u)
Tôi muốn gửi lời cảm ơn user @piRSquared cho đến với một NumPy thực sự nhanh chóng và tổng quát dựa soln thay thế.
lưu ý rằng điều này chỉ hoạt động trong những trường hợp đặc biệt trong đó mọi thứ được đại diện gọn gàng. Đó là một câu trả lời tuyệt vời, tôi chỉ chỉ nó ra – piRSquared
Cảm ơn. Tôi đoán OP đã đề cập đến trường hợp này ở cuối bài đăng của họ. Nếu không, nếu không phải tất cả các cột đều được biểu diễn bằng nhau, thì tôi đoán điều này sẽ thất bại. –
Điều đó có ý nghĩa – piRSquared