कैसे एक पांडा में "" से छुटकारा पाने के लिए कॉलम DataFrame?


152

मैं एक स्थिति है जब मैंने पढ़ा है जिसमें कभी कभी एक है csvसे dfमैं एक अवांछित सूचकांक की तरह नामित स्तंभ मिलता unnamed:0

file.csv

,A,B,C
0,1,2,3
1,4,5,6
2,7,8,9

CSV को इसके साथ पढ़ा जाता है:

pd.read_csv('file.csv')

   Unnamed: 0  A  B  C
0           0  1  2  3
1           1  4  5  6
2           2  7  8  9

यह बहुत कष्टप्रद है! क्या किसी को इस बात का अंदाजा है कि इससे कैसे छुटकारा पाया जाए?

जवाबों:


186

यह इंडेक्स कॉलम है, index=Falseइसे न लिखने के लिए पास करें, डॉक्स देखें

उदाहरण:

In [37]:
df = pd.DataFrame(np.random.randn(5,3), columns=list('abc'))
pd.read_csv(io.StringIO(df.to_csv()))

Out[37]:
   Unnamed: 0         a         b         c
0           0  0.109066 -1.112704 -0.545209
1           1  0.447114  1.525341  0.317252
2           2  0.507495  0.137863  0.886283
3           3  1.452867  1.888363  1.168101
4           4  0.901371 -0.704805  0.088335

तुलना करना:

In [38]:
pd.read_csv(io.StringIO(df.to_csv(index=False)))

Out[38]:
          a         b         c
0  0.109066 -1.112704 -0.545209
1  0.447114  1.525341  0.317252
2  0.507495  0.137863  0.886283
3  1.452867  1.888363  1.168101
4  0.901371 -0.704805  0.088335

आप वैकल्पिक रूप से यह भी बता सकते हैं read_csvकि पहला कॉलम उत्तीर्ण होकर सूचकांक स्तंभ है index_col=0:

In [40]:
pd.read_csv(io.StringIO(df.to_csv()), index_col=0)

Out[40]:
          a         b         c
0  0.109066 -1.112704 -0.545209
1  0.447114  1.525341  0.317252
2  0.507495  0.137863  0.886283
3  1.452867  1.888363  1.168101
4  0.901371 -0.704805  0.088335

कई बार आपके द्वारा कहीं और प्राप्त किए गए डेटासेट में पहले से ही यह कॉलम होता है इसलिए यह वास्तव में यह जानने में मदद नहीं करता है कि सही मापदंडों का उपयोग करके "सही" डेटासेट का उत्पादन कैसे किया जाए। क्या इस कॉलम को खत्म करने का कोई तरीका है जब आप इसे लोड करते हैं जब यह पहले से ही वहां होता है?
केल्विन कु

2
@CalvinKu दुर्भाग्यवश, इसके लिए कोई skipcolsतर्क नहीं है read_csv, सीएसवी में पढ़ने के बाद आप बस कर सकते हैं df = df.drop(columns=df.columns[0])या आप पहले कॉलम को पढ़ सकते हैं और फिर पहले कॉलम को कुछ इस तरह से पास कर सकते हैं cols = pd.read_csv( ....., nrows=1).columnsऔर फिर दोबारा पढ़ने से df = pd.read_csv(....., usecols=cols[1:])यह पढ़ने के ओवरहेड से बचा जाता है। एक शानदार स्तंभ और फिर बाद में इसे छोड़ देना
एडुकम

43

यह समस्या सबसे अधिक प्रकट होती है क्योंकि आपका CSV इसके साथ सहेजा गया था RangeIndex(जिसका आमतौर पर नाम नहीं होता)। डेटाफ़्रेम को सहेजते समय फ़िक्स को वास्तव में करने की आवश्यकता होगी, लेकिन यह हमेशा एक विकल्प नहीं होता है।

समस्या से बचना: तर्क के read_csvसाथindex_col

IMO, इंडेक्स के रूप में अनाम कॉलम को पढ़ना सबसे सरल उपाय होगा । एक index_col=[0]तर्क निर्दिष्ट करें pd.read_csv, यह सूचकांक के रूप में पहले कॉलम में पढ़ता है।

df = pd.DataFrame('x', index=range(5), columns=list('abc'))
df

   a  b  c
0  x  x  x
1  x  x  x
2  x  x  x
3  x  x  x
4  x  x  x

# Save DataFrame to CSV.
df.to_csv('file.csv')

pd.read_csv('file.csv')

   Unnamed: 0  a  b  c
0           0  x  x  x
1           1  x  x  x
2           2  x  x  x
3           3  x  x  x
4           4  x  x  x

# Now try this again, with the extra argument.
pd.read_csv('file.csv', index_col=[0])

   a  b  c
0  x  x  x
1  x  x  x
2  x  x  x
3  x  x  x
4  x  x  x

नोट
यदि आप index=Falseअपने डेटाफ़्रेम को प्रारंभ करने के लिए कोई इंडेक्स नहीं बनाते हैं, तो आउटपुट CSV बनाते समय उपयोग करके आप इसे पहले ही टाल सकते थे।

df.to_csv('file.csv', index=False)

लेकिन जैसा कि ऊपर कहा गया है, यह हमेशा एक विकल्प नहीं है।


स्टॉपगैप सॉल्यूशन: फ़िल्टरिंग के साथ str.match

आप पढ़ सकते हैं / CSV फ़ाइल में लिखने के लिए कोड संशोधित नहीं कर सकते हैं, तो आप सिर्फ कर सकते हैं छान कर इस स्तंभ को निकालने के साथ str.match:

df 

   Unnamed: 0  a  b  c
0           0  x  x  x
1           1  x  x  x
2           2  x  x  x
3           3  x  x  x
4           4  x  x  x

df.columns
# Index(['Unnamed: 0', 'a', 'b', 'c'], dtype='object')

df.columns.str.match('Unnamed')
# array([ True, False, False, False])

df.loc[:, ~df.columns.str.match('Unnamed')]

   a  b  c
0  x  x  x
1  x  x  x
2  x  x  x
3  x  x  x
4  x  x  x

1
आपका बहुत बहुत धन्यवाद! उस index_col=[0]फिक्स ने 'अनाम: 0' की इस कष्टप्रद समस्या को आसानी से हल कर दिया और पहिया को सुदृढ़ करने वाली क्रिया से पुर्जों का कोड।
548 बजे उपयोगकर्ता48115

1
स्तंभों की सवारी प्राप्त करने के लिए, आप regex का उपयोग भी कर सकते हैं जैसेdf.drop(df.filter(regex="Unname"),axis=1, inplace=True)
सारा

8

एक और मामला यह हो सकता है कि यदि आपका डेटा अनुचित रूप से आपके csvलिए प्रत्येक पंक्ति को अल्पविराम के साथ लिखा गया है । Unnamed: xजब आप इसे पढ़ने की कोशिश करेंगे तो यह आपके डेटा के अंत में एक अनाम कॉलम के साथ आपको छोड़ देगा df


2
मैंने usecols=range(0,10)अनाम कॉलम
नैश

8

सभी कॉलमों की सवारी करने के लिए, आप regex का उपयोग भी कर सकते हैं df.drop(df.filter(regex="Unname"),axis=1, inplace=True)


2

बस उस कॉलम का उपयोग करके हटाएं: del df['column_name']

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