आप apply
उपयोग कर सकते हैं अगर आप factorize
के लिए अलग से प्रत्येक स्तंभ की जरूरत है:
df = pd.DataFrame({'A':['type1','type2','type2'],
'B':['type1','type2','type3'],
'C':['type1','type3','type3']})
print (df)
A B C
0 type1 type1 type1
1 type2 type2 type3
2 type2 type3 type3
print (df.apply(lambda x: pd.factorize(x)[0]))
A B C
0 0 0 0
1 1 1 1
2 1 2 1
आप एक ही स्ट्रिंग मान ही सांख्यिक एक के लिए की जरूरत है:
print (df.stack().rank(method='dense').unstack())
A B C
0 1.0 1.0 1.0
1 2.0 2.0 3.0
2 2.0 3.0 3.0
यदि आपको केवल फ़ंक्शन को लागू करने की आवश्यकता है dict
है, जहां आप drop_duplicates
आधार पर डुप्लीकेट हटाने की जरूरत द्वारा map
के माध्यम से संभव
stacked = df[['B','C']].stack()
df[['B','C']] = pd.Series(stacked.factorize()[0], index=stacked.index).unstack()
print (df)
A B C
0 type1 0 0
1 type2 1 2
2 type2 2 2
उन्हें अनुवाद वापस आ गया है:
df[['B','C']] = df[['B','C']].stack().rank(method='dense').unstack()
print (df)
A B C
0 type1 1.0 1.0
1 type2 2.0 3.0
2 type2 3.0 3.0
factorize
साथ समाधान: कुछ स्तंभ, एक सबसेट का उपयोग
vals = df.stack().drop_duplicates().values
b = [x for x in df.stack().drop_duplicates().rank(method='dense')]
d1 = dict(zip(b, vals))
print (d1)
{1.0: 'type1', 2.0: 'type2', 3.0: 'type3'}
df1 = df.stack().rank(method='dense').unstack()
print (df1)
A B C
0 1.0 1.0 1.0
1 2.0 2.0 3.0
2 2.0 3.0 3.0
print (df1.stack().map(d1).unstack())
A B C
0 type1 type1 type1
1 type2 type2 type3
2 type2 type3 type3
और अगर मैं सिर्फ कॉलम की एक सूची के लिए, हर स्तंभ के लिए समारोह लागू करने के लिए नहीं करना चाहते? – clstaudt
आप सबसेट का उपयोग कर सकते हैं, मुझे एक सेकंड दें। – jezrael