मैं एक इंडेक्स टाइप वेरिएबल (Pandas.Index) पास कर रहा था जिसमें कॉलम के लेबल हैं जिन्हें मैं अपने डेटाफ्रेम से छोड़ना चाहता हूं और यह सही तरीके से काम कर रहा था। यह इंडेक्स टाइप था क्योंकि मैं डेटाफ्रेम से ही कुछ शर्तों के आधार पर कॉलम नाम निकाल रहा था।

बाद में, मुझे उस सूची में एक और कॉलम नाम जोड़ने की आवश्यकता थी, इसलिए मैंने इंडेक्स ऑब्जेक्ट को पायथन सूची में बदल दिया ताकि मैं अतिरिक्त लेबल नाम जोड़ सकूं। लेकिन डेटाफ़्रेम पर drop() विधि में कॉलम पैरामीटर के रूप में सूची पास करने पर, मुझे अब त्रुटि मिलती रहती है:

ValueError: Need to specify at least one of 'labels', 'index' or 'columns'

इस त्रुटि को कैसे हल करें?

मैं जिस कोड का उपयोग करता हूं वह इस प्रकार है:

unique_count = df.apply(pd.Series.nunique)
redundant_columns = unique_count[unique_count == 1].index.values.tolist()
redundant_columns.append('DESCRIPTION')
print(redundant_columns)
df.drop(columns=redundant_columns, inplace=True)

Out: None

मैंने पाया कि त्रुटि क्यों हो रही है। append() स्टेटमेंट के बाद, redundant_columns, None बन रहा है। मुझे नहीं पता क्यों। मुझे अच्छा लगेगा अगर कोई समझा सके कि ऐसा क्यों हो रहा है?

1
Sushovan Mandal 23 अप्रैल 2018, 13:42

3 जवाब

सबसे बढ़िया उत्तर

मेरे लिए आपका समाधान अच्छा काम कर रहा है।

boolean indexing:

df = pd.DataFrame({'A':list('bbbbbb'),
                   'DESCRIPTION':[4,5,4,5,5,4],
                   'C':[7,8,9,4,2,3],
                   'D':[1,3,5,7,1,0],
                   'E':[5,3,6,9,2,4],
                   'DESCRIPTION':list('aaabbb')})

print (df)
   A  C  D DESCRIPTION  E
0  b  7  1           a  5
1  b  8  3           a  3
2  b  9  5           a  6
3  b  4  7           b  9
4  b  2  1           b  2
5  b  3  0           b  4

mask = df.nunique().ne(1)
mask['DESCRIPTION'] = False
df = df.loc[:, mask]

print (df)
   C  D  E
0  7  1  5
1  8  3  3
2  9  5  6
3  4  7  9
4  2  1  2
5  3  0  4

व्याख्या:

  1. पहले nunique तक अद्वितीय मानों की लंबाई प्राप्त करें और ne बराबर नहीं के लिए
  2. हमेशा हटाने के लिए बूलियन मास्क - कॉलम DESCRIPTION से False बदलें
  3. boolean indexing द्वारा फ़िल्टर करें

विवरण:

print (df.nunique())

A              1
C              6
D              5
DESCRIPTION    2
E              6
dtype: int64

mask = df.nunique().ne(1)
print (mask)
A              False
C               True
D               True
DESCRIPTION     True
E               True

mask['DESCRIPTION'] = False
print (mask)
A              False
C               True
D               True
DESCRIPTION    False
E               True
dtype: bool
2
jezrael 23 अप्रैल 2018, 14:04

चारों ओर कोशिश करने के बाद, यह सादे पायथन सूची के बजाय numpy.ndarray का उपयोग करके तय हो गया, हालांकि मुझे नहीं पता क्यों।

मेरे परीक्षणों में, सादे पायथन सूची का उपयोग करके ValueError, pandas.Index या numpy.ndarray टाइप ऑब्जेक्ट दे रहा है जिसमें लेबल ठीक काम कर रहे हैं। तो मैं np.ndarray के साथ गया क्योंकि यह परिशिष्ट है।

वर्तमान कार्य कोड:

    unique_count = df.apply(pd.Series.nunique)
    redundant_columns: np.ndarray = unique_count[unique_count == 1].index.values
    redundant_columns = np.append(redundant_columns, 'DESCRIPTION')
    self.full_data.drop(columns=redundant_columns, inplace=True)
1
Sushovan Mandal 23 अप्रैल 2018, 14:13

आरंभीकरण की पंक्ति में .remove का उपयोग करते समय मुझे वही त्रुटि हुई:

myNewList = [i for i in myOldList].remove('Last Item')

MyNewList कोई भी प्रकार नहीं बन जाएगा। एक अलग कॉलम में .tolist() का उपयोग करने से आपको मदद मिल सकती है:

redundant_columns = unique_count[unique_count == 1].index.values
redundant_columns.tolist()
redundant_columns.append('DESCRIPTION')
0
Lennart Scharmann 8 अक्टूबर 2018, 19:23