কীভাবে প্যান্ডাস ডেটাফ্রেমে "অবরুদ্ধ: 0" কলামটি থেকে মুক্তি পাবেন?


152

আমি একটি অবস্থা যখন আমি পড়তে যেখানে কখনো কখনো একটি আছে csvথেকে dfআমি একজন অবাঞ্ছিত সূচক মত নামে কলাম পেতে unnamed:0

file.csv

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

সিএসভি এটি দিয়ে পড়া হয়:

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জন্য ARG read_csvCSV মধ্যে পড়া আপনি শুধু করতে পারে পরে, df = df.drop(columns=df.columns[0])অথবা আপনি শুধু প্রথম কলাম পড়তে পারি এবং তারপর COLS বিয়োগ মত প্রথম কলামে কিছু পাস cols = pd.read_csv( ....., nrows=1).columnsআবার পুনরায় পড়া এবং তারপর df = pd.read_csv(....., usecols=cols[1:])এই পড়ার ওভারহেড এড়াতে একটি অতিরিক্ত অতিরিক্ত কলাম এবং তারপরে এটি বাদ
দিচ্ছে

43

এই সমস্যাটি সম্ভবত উদ্ভাসিত হয় কারণ আপনার সিএসভি এর সাথে সংরক্ষণ করা হয়েছিল RangeIndex(যার সাধারণত নাম থাকে না)। ডেটাফ্রেম সংরক্ষণ করার সময় এই ফিক্সটি আসলেই করা দরকার, তবে এটি সর্বদা কোনও বিকল্প নয়।

এড়ানো সমস্যা: read_csvসঙ্গে index_col যুক্তি

আইএমও, সবচেয়ে সহজ সমাধান হ'ল সূচি হিসাবে নামহীন কলামটি পড়া । একটি 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, যদি আপনার ডেটাফ্রেমের সূচনা না শুরু হয়।

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' এর বিরক্তিকর সমস্যার সমাধান করে এবং ভার্জোজ চক্রটিকে পুনরায় উদ্ভাবন করা থেকে কোড ছাড়ায়।
ব্যবহারকারী 48115

1
নামবিহীন কলামগুলির যাত্রা পেতে, আপনি রেজেেক্সগুলিও ব্যবহার করতে পারেনdf.drop(df.filter(regex="Unname"),axis=1, inplace=True)
সারা

8

এটি ঘটতে পারে এমন আরেকটি ক্ষেত্রে হ'ল যদি আপনার ডেটাটি csvকমা দিয়ে প্রতিটি সারি শেষ করার জন্য ভুলভাবে লেখা হয় । আপনি Unnamed: xযখন এটিতে পড়ার চেষ্টা করবেন এটি আপনার ডেটার শেষে একটি নামহীন কলাম সহ আপনাকে ছেড়ে দেবে df


2
আমি usecols=range(0,10)নামবিহীন কলামটি কাটতাম
ন্যাশ

8

সমস্ত নামহীন কলামগুলির যাত্রা পেতে, আপনি যেমন রেগেক্সও ব্যবহার করতে পারেন df.drop(df.filter(regex="Unname"),axis=1, inplace=True)


2

কেবল এই কলামটি ব্যবহার করে মুছুন: del df['column_name']

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.