कई श्रेणीगत कॉलमों को परिवर्तित करें


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

आप पहले अपने डेटाफ्रेम में अनूठे मूल्यों के साथ लेबलइन्कोडर () फिट कर सकते हैं और फिर बदल सकते हैं।

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.uniqueके साथ return_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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.