2017-02-22 4 views
7

मैं एक नया डेटासेट प्राप्त करने की कोशिश कर रहा हूं, या वर्तमान डेटासेट कॉलम के मान को उनके अद्वितीय मूल्यों में बदल रहा हूं। यहाँ मैं क्या पाने के लिए कोशिश कर रहा हूँ का एक उदाहरण है:ValueError: मानों की लंबाई सूचकांक की लंबाई से मेल नहीं खाती है। पांडस DataFrame.unique()

A B 
----- 
0| 1 1 
1| 2 5 
2| 1 5 
3| 7 9 
4| 7 9 
5| 8 9 

Wanted Result Not Wanted Result 
     A B   A B 
    -----   ----- 
    0| 1 1   0| 1 1 
    1| 2 5   1| 2 5 
    2| 7 9   2| 
    3| 8   3| 7 9 
        4| 
        5| 8 

मैं वास्तव में सूचकांक के बारे में परवाह नहीं है, लेकिन यह समस्या लगती है। मेरा कोड अब तक बहुत आसान है, मैंने 2 दृष्टिकोणों की कोशिश की, 1 एक नए डेटा के साथ फ्रेम और बिना किसी के।

#With New DataFrame 
def UniqueResults(dataframe): 
    df = pd.DataFrame() 
    for col in dataframe: 
     S=pd.Series(dataframe[col].unique()) 
     df[col]=S.values 
    return df 

#Without new DataFrame 
def UniqueResults(dataframe): 
    for col in dataframe: 
     dataframe[col]=dataframe[col].unique() 
    return dataframe 

मुझे त्रुटि है "मानों की लंबाई सूचकांक की लंबाई से मेल नहीं खाती" दोनों बार।

उत्तर

7

त्रुटि ऊपर आता है जब आप एक डेटा फ्रेम करने के लिए विभिन्न लंबाई के numpy सरणी की एक सूची आवंटित करने के लिए कोशिश कर रहे हैं, और यह reproduced किया जा सकता है इस प्रकार है:

चार पंक्तियों का एक डेटा फ्रेम:

df = pd.DataFrame({'A': [1,2,3,4]}) 

अब एक सूची असाइन करने की कोशिश/यह करने के लिए दो तत्व सरणी:

df['B'] = [3,4] # or df['B'] = np.array([3,4]) 

दोनों त्रुटियों आउट:

ValueError: Length of values does not match length of index

क्योंकि डेटा फ्रेम में चार पंक्तियां हैं लेकिन सूची और सरणी में केवल दो तत्व हैं। समाधान आसपास

कार्य (सावधानी के साथ प्रयोग): एक पांडा सीरीज के लिए सूची/सरणी कनवर्ट करते हैं, और फिर जब तुम काम करते हैं, सीरीज में लापता सूचकांक NaN से भर दिया जाएगा:

df['B'] = pd.Series([3,4]) 

df 
# A  B 
#0 1 3.0 
#1 2 4.0 
#2 3 NaN   # NaN because the value at index 2 and 3 doesn't exist in the Series 
#3 4 NaN 

अपने विशिष्ट समस्या के लिए, यदि आप सूचकांक या स्तंभों के बीच मूल्यों के पत्राचार के बारे में परवाह नहीं है, आप सूचकांक प्रत्येक स्तंभ के लिए डुप्लिकेट छोड़ने के बाद रीसेट कर सकते हैं:

df.apply(lambda col: col.drop_duplicates().reset_index(drop=True)) 

# A  B 
#0 1 1.0 
#1 2 5.0 
#2 7 9.0 
#3 8 NaN 
+0

धन्यवाद यह ठीक काम कर रहा है! मैंने इस बारे में इस बारे में सोचा नहीं था, थोड़ा सवाल, जब मैंने इसे सीएसवी में सहेजा था, तो इस कोड ने कोई भी नाएन उत्पन्न नहीं किया था, लेकिन मुझे लगता है कि कुछ कॉलम के शीर्ष पर सेल है जो मुझे लगता है कि नैन हैं, सवाल यह है: NaNs हैं हमेशा शीर्ष पर होने जा रहे हैं? –

+0

मुझे ऐसा नहीं लगता है। वे नीचे होना चाहिए, जब तक कि कुछ मूल्य कुछ स्तंभों के लिए नैन न हों। – Psidom

+0

ठीक है, मैं NaNs के साथ रिक्त स्थान भरने वाला हूं और जांचता हूं कि आउटपुट –

संबंधित मुद्दे