แปลงคอลัมน์เด็ดขาดหลายรายการ


10

ในชุดข้อมูลของฉันฉันมีสองคอลัมน์เด็ดขาดซึ่งฉันต้องการที่จะนับ ทั้งสองคอลัมน์มีทั้งประเทศซ้อนทับกันบางส่วน (ปรากฏในทั้งสองคอลัมน์) ฉันต้องการให้หมายเลขเดียวกันในคอลัมน์ 1 และคอลัมน์ 2 สำหรับประเทศเดียวกัน

ข้อมูลของฉันดูเหมือนว่า:

import pandas as pd

d = {'col1': ['NL', 'BE', 'FR', 'BE'], 'col2': ['BE', 'NL', 'ES', 'ES']}
df = pd.DataFrame(data=d)
df

ฉันกำลังแปลงข้อมูลเช่น:

from sklearn.preprocessing import LabelEncoder
df.apply(LabelEncoder().fit_transform)

อย่างไรก็ตามสิ่งนี้ทำให้ไม่มีความแตกต่างระหว่าง FR และ ES มีวิธีง่ายๆอีกวิธีในการแสดงผลลัพธ์ต่อไปนี้?

o = {'col1': [2,0,1,0], 'col2': [0,2,4,4]}
output = pd.DataFrame(data=o)
output

คำตอบ:


8

นี่คือวิธีหนึ่ง

df.stack().astype('category').cat.codes.unstack()
Out[190]: 
   col1  col2
0     3     0
1     0     3
2     2     1
3     0     1

หรือ

s=df.stack()
s[:]=s.factorize()[0]
s.unstack()
Out[196]: 
   col1  col2
0     0     1
1     1     0
2     2     3
3     1     3

5

คุณสามารถใส่ LabelEncoder () กับค่าที่ไม่ซ้ำใน dataframe ของคุณก่อนแล้วจึงทำการแปลง

le = LabelEncoder()
le.fit(pd.concat([df.col1, df.col2]).unique()) # or np.unique(df.values.reshape(-1,1))

df.apply(le.transform)
Out[28]: 
   col1  col2
0     3     0
1     0     3
2     2     1
3     0     1

2

np.uniquereturn_invesereกับ แม้ว่าคุณจะต้องสร้าง DataFrame ขึ้นใหม่

pd.DataFrame(np.unique(df, return_inverse=True)[1].reshape(df.shape),
             index=df.index,
             columns=df.columns)

   col1  col2
0     3     0
1     0     3
2     2     1
3     0     1
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.