2013-03-07 13 views
6

मैं डेटा है, जो ints से भर जाता है की मेरे वर्तमान सेट लेते हैं, और कुछ मानदंडों के अनुसार उन्हें वर्गीकृत करने के लिए सक्षम होना चाहते हैं में एक नया स्तंभ के लिए एक श्रृंखला को वर्गीकृत।पांडा

[in]> df = pd.DataFrame({'A':[0,2,3,2,0,0],'B': [1,0,2,0,0,0],'C': [0,0,1,0,1,0]}) 
[out]> 
    A B C 
0 0 1 0 
1 2 0 0 
2 3 2 1 
3 2 0 0 
4 0 0 1 
5 0 0 0 

मैं स्ट्रिंग द्वारा एक अलग कॉलम में इन वर्गीकृत करने के लिए करना चाहते हैं: तालिका कुछ इस तरह लग रहा है। आर से अधिक परिचित होने के कारण, मैंने उस कॉलम की परिभाषा में नियमों के साथ एक नया स्तंभ बनाने की कोशिश की। उसके बाद मैंने .ix और lambdas के साथ प्रयास किया, जिसके परिणामस्वरूप दोनों प्रकार की त्रुटियां हुईं (इनट्स & श्रृंखला के बीच)। मैं इस धारणा के तहत हूं कि यह एक काफी सरल सवाल है।

df['D']=(
if ((df['A'] > 0) & (df['B'] == 0) & df['C']==0): 
    return "c1"; 
elif ((df['A'] == 0) & ((df['B'] > 0) | df['C'] >0)): 
    return "c2"; 
else: 
    return "c3";) 
के अंतिम परिणाम के लिए

:: हालांकि निम्नलिखित पूरी तरह से गलत है, यहाँ का प्रयास 1 से तर्क है

A B C  D 
0 0 1 0 "c2" 
1 2 0 0 "c1" 
2 3 2 1 "c3" 
3 2 0 0 "c1" 
4 0 0 1 "c2" 
5 0 0 0 "c3" 

किसी की मदद कर सकता है मुझे यह पता लगा यह बहुत सराहना की जाएगी।

उत्तर

8

मैं दो तरीकों के बारे में सोच सकते हैं। पहले एक वर्गीकारक समारोह लिखने के लिए और उसके बाद .apply यह पंक्ति के लिहाज से है:

>>> import pandas as pd 
>>> df = pd.DataFrame({'A':[0,2,3,2,0,0],'B': [1,0,2,0,0,0],'C': [0,0,1,0,1,0]}) 
>>> 
>>> def classifier(row): 
...   if row["A"] > 0 and row["B"] == 0 and row["C"] == 0: 
...     return "c1" 
...   elif row["A"] == 0 and (row["B"] > 0 or row["C"] > 0): 
...     return "c2" 
...   else: 
...     return "c3" 
...  
>>> df["D"] = df.apply(classifier, axis=1) 
>>> df 
    A B C D 
0 0 1 0 c2 
1 2 0 0 c1 
2 3 2 1 c3 
3 2 0 0 c1 
4 0 0 1 c2 
5 0 0 0 c3 

और दूसरे उन्नत अनुक्रमण उपयोग करने के लिए है:

>>> df = pd.DataFrame({'A':[0,2,3,2,0,0],'B': [1,0,2,0,0,0],'C': [0,0,1,0,1,0]}) 
>>> df["D"] = "c3" 
>>> df["D"][(df["A"] > 0) & (df["B"] == 0) & (df["C"] == 0)] = "c1" 
>>> df["D"][(df["A"] == 0) & ((df["B"] > 0) | (df["C"] > 0))] = "c2" 
>>> df 
    A B C D 
0 0 1 0 c2 
1 2 0 0 c1 
2 3 2 1 c3 
3 2 0 0 c1 
4 0 0 1 c2 
5 0 0 0 c3 

कौन सा स्पष्ट है स्थिति पर निर्भर करता है। आम तौर पर अधिक जटिल तर्क जितना अधिक मैं इसे एक समारोह में लपेटना चाहता हूं, तब मैं दस्तावेज और परीक्षण कर सकता हूं।

+0

मैं विधि 2 बस पठनीयता के लिए के लिए वोट देते हैं। –