পান্ডাসে কলামের নামের উপর ভিত্তি করে একাধিক কলাম মুছে ফেলা হচ্ছে


94

আমার কিছু তথ্য রয়েছে এবং আমি যখন এটি আমদানি করি তখন নীচের অনির্বাণিত কলামগুলি পেয়েছি আমি এগুলি মুছতে একটি সহজ উপায় খুঁজছি

   'Unnamed: 24', 'Unnamed: 25', 'Unnamed: 26', 'Unnamed: 27',
   'Unnamed: 28', 'Unnamed: 29', 'Unnamed: 30', 'Unnamed: 31',
   'Unnamed: 32', 'Unnamed: 33', 'Unnamed: 34', 'Unnamed: 35',
   'Unnamed: 36', 'Unnamed: 37', 'Unnamed: 38', 'Unnamed: 39',
   'Unnamed: 40', 'Unnamed: 41', 'Unnamed: 42', 'Unnamed: 43',
   'Unnamed: 44', 'Unnamed: 45', 'Unnamed: 46', 'Unnamed: 47',
   'Unnamed: 48', 'Unnamed: 49', 'Unnamed: 50', 'Unnamed: 51',
   'Unnamed: 52', 'Unnamed: 53', 'Unnamed: 54', 'Unnamed: 55',
   'Unnamed: 56', 'Unnamed: 57', 'Unnamed: 58', 'Unnamed: 59',
   'Unnamed: 60'

সেগুলি 0-সূচী দ্বারা সূচিত হয় তাই আমি এর মতো কিছু চেষ্টা করেছি

    df.drop(df.columns[[22, 23, 24, 25, 
    26, 27, 28, 29, 30, 31, 32 ,55]], axis=1, inplace=True)

তবে এটি খুব দক্ষ নয়। আমি লুপগুলির জন্য কিছু লেখার চেষ্টা করেছি তবে এটি আমার খারাপ পান্ডাদের আচরণ হিসাবে আঘাত করেছে। সুতরাং আমি এখানে প্রশ্ন জিজ্ঞাসা।

আমি কিছু উদাহরণ দেখেছি যা একই রকম ( একাধিক কলাম প্যান্ডা ফেলে দিন ) তবে এটি আমার প্রশ্নের উত্তর দেয় না।


4
দক্ষ বলতে কী বোঝ? এটা কি খুব ধীর চলছে? যদি আপনার সমস্যাটি হ'ল আপনি মুছে ফেলতে চান এমন সমস্ত কলামের সূচকগুলি পেতে চান না, দয়া করে নোট করুন যে আপনি কেবল df.dropকলামের নামের একটি তালিকা দিতে পারেন :df.drop(['Unnamed: 24', 'Unnamed: 25', ...], axis=1)
কার্স্টেন

কেবল আগ্রহের কলামগুলি সাবসেট করা কি সহজ হবে না: উদাহরণস্বরূপ df = df[cols_of_interest], অন্যথায় আপনি df কে কলাম করে টুকরো টুকরো করে কলামগুলি পেতে পারেনdf.drop(df.ix[:,'Unnamed: 24':'Unnamed: 60'].head(0).columns, axis=1)
এডচাম

4
টাইপিং বা 'খারাপ কোড গন্ধ' এর ক্ষেত্রে আমি অক্ষম বলতে চাইছি
পিডার কোয়েল

4
লক্ষ্য করার মতো বিষয় যে বেশিরভাগ ক্ষেত্রে আপনার নিজের পছন্দমতো কলামগুলি রাখা তারপরে আপনার যেগুলি নয় সেগুলি মুছে ফেলা সহজ: df = df ['col_list']
স্প্যারো ২

উত্তর:


65

অদক্ষ বলতে কী বোঝাতে চেয়েছি তা আমি জানি না তবে আপনি যদি টাইপিংয়ের শর্তাবলী বলতে চান তবে কেবল আগ্রহের কলগুলি নির্বাচন করা এবং ডিএফ-এ পুনরায় নির্ধারণ করা আরও সহজ হতে পারে:

df = df[cols_of_interest]

cols_of_interestআপনার যত্ন নেওয়া কলামগুলির তালিকা কোথায় ।

অথবা আপনি কলামগুলি টুকরো টুকরো করে কেটে দিতে পারেন drop:

df.drop(df.ix[:,'Unnamed: 24':'Unnamed: 60'].head(0).columns, axis=1)

থেকে কল headশুধু নির্বাচন 0 সারি যেহেতু আমরা কেবলমাত্র ডেটা বদলে কলাম নামে প্রতি আগ্রহ দেখিয়েছেন

হালনাগাদ

অন্য পদ্ধতি: str.containsকলামগুলি মাস্ক করার জন্য এটি থেকে বুলিয়ান মাস্ক ব্যবহার করা এবং এটি উল্টানো সহজ হবে:

In [2]:
df = pd.DataFrame(columns=['a','Unnamed: 1', 'Unnamed: 1','foo'])
df

Out[2]:
Empty DataFrame
Columns: [a, Unnamed: 1, Unnamed: 1, foo]
Index: []

In [4]:
~df.columns.str.contains('Unnamed:')

Out[4]:
array([ True, False, False,  True], dtype=bool)

In [5]:
df[df.columns[~df.columns.str.contains('Unnamed:')]]

Out[5]:
Empty DataFrame
Columns: [a, foo]
Index: []

আমি যখন either df.col સ્તামগুলি করার চেষ্টা করি তখন ত্রুটিগুলি পাই ... (TypeError: unary bad: 'str') বা df.columns.str.contains এর জন্য খারাপ অপরেন্ড টাইপ ... (এ্যাট্রিবিউটআরার: 'সূচক' অবজেক্টটির কোনও বৈশিষ্ট্য নেই 'str')। কোন ধারনা কেন এই হতে পারে?
দাই

@ এডচাম আমি কি ডিএফ = ডিএফ [কলস_ফ_আইনটারেস্ট] তৈরি করতে পারি , যেখানে কলস_ফ_আইন্টারে প্রতিবার লুপ পুনরাবৃত্তির জন্য এটিতে একটি কলামের নাম যুক্ত করে?

@ ভিক্টর না, যদি আপনি এটি করেন যে dfআপনার নিজের নতুন কলামটি দিয়ে আপনার এটি মুছে ফেলা উচিত appendতবে আমি আপনার প্রশ্নটি সত্যিই বুঝতে পারি না, এসও
এডচাম

@ এডচাম আপনি একদম ঠিক বলেছেন আমি প্রশ্নটি তৈরি করেছি এবং এসওর বিভিন্ন অংশ অনুসন্ধান করে এটি সমাধানের চেষ্টা করছি। এখানে লিংক! কোনো অবদান সাহায্য করবে stackoverflow.com/questions/48923915/...

213

এতদূর সহজ পদ্ধিতি হ'ল:

yourdf.drop(['columnheading1', 'columnheading2'], axis=1, inplace=True)

4
আমি আমার কোডের কিছুতে এই ফর্ম্যাটটি ব্যবহার করেছি এবং আমি একটি SettingWithCopyWarningসতর্কতা পেয়েছি ?
কিলারস্নাইল

4
@ কিলারস্নাইল, এটি উপেক্ষা করা নিরাপদ। ত্রুটি এড়াতে, চেষ্টা করুন: df = df.rod (['colheading1', 'colheading2'], অক্ষ = 1)
ফিলিপ শোয়ার্জ

4
শব্দটি axisব্যাখ্যা করা হয়েছে: স্ট্যাকওভারফ্লো . com / প্রশ্নগুলি / ২২২৪৪৫৪৪৮/২ । মূলত, axis=0এটি "কলাম ভিত্তিক" এবং axis=1"সারি অনুসারে" বলা হয়।
রোহমার

4
এবং এর inplace=Trueমানে হল যে DataFrameজায়গায় পরিবর্তিত হয়েছে।
রোহমার

4
@ কিলার্নেল যদি আপনি সতর্কতা না চান তবে করুনyourdf = yourdf.drop(['columnheading1', 'columnheading2'], axis=1)
হ্যাপি_সিসফাস

41

আমার ব্যক্তিগত প্রিয় এবং আমি এখানে যে উত্তরগুলি দেখেছি তার চেয়ে সহজ (একাধিক কলামের জন্য):

df.drop(df.columns[22:56], axis=1, inplace=True)

বা একাধিক কলামের জন্য একটি তালিকা তৈরি করা।

col = list(df.columns)[22:56]
df.drop(col, axis=1, inplace=1)

8
এই উত্তর হওয়া উচিত। সোজা, পড়ার পক্ষে সহজ, সোজা দেশীয় পান্ডাস সূচক সিনট্যাক্স সহ।
ব্রেন্ট ফাউস্ট 21

4
এই উত্তরের পাশে সবুজ রঙের টিকটি থাকা উচিত, অন্যগুলি নয়।
শায়ভোষ মাহবুব্বিয়ান

4
ছোট সংশোধন (যদি না আমি ভুল করে থাকি): কোডের দ্বিতীয় ব্লকের 'ইনপ্লেস = 1' এর পরিবর্তে 'ইনপ্লেস = ট্রু' থাকা উচিত।
থ্রেডলসন

20

আপনি যা চান তা করার সম্ভবত এটি একটি ভাল উপায়। এটি তাদের শিরোনামে সমস্ত 'কলাম' মুছে ফেলা হবে।

for col in df.columns:
    if 'Unnamed' in col:
        del df[col]

এটিকে আরও for col in df.columns:সহজ করা যেতে পারে for col in df:, এছাড়াও ওপি অন্যান্য কলামগুলির জন্য নামকরণের স্কিমটি কী তা নির্দেশ করে না, তারা সকলেই 'অ্যানমোস্ট' ধারণ করতে পারে, এটিও অদক্ষ কারণ এটি একবারে কলামগুলি একসাথে সরিয়ে দেয়
এডচাম

এটি অবশ্যই দক্ষ নয়, তবে যতক্ষণ আমরা বিশাল ডেটাফ্রেমে কাজ করছি না ততক্ষণ তা এর উল্লেখযোগ্য প্রভাব ফেলবে না। এই পদ্ধতির প্লাস পয়েন্ট হ'ল এটি মনে রাখা সহজ এবং কোডের পক্ষে দ্রুত - আপনি যে কলামগুলি রাখতে চান তার একটি তালিকা তৈরি করার সময় বেশ বেদনাদায়ক হতে পারে।
নাইটফনি

আমি মনে করি এটি বৃহত্তর ডিএফ-এ সবচেয়ে পারফরম্যান্স হতে পারে কারণ আপনাকে স্থানীয় কপি তৈরি করতে হবে নাinplace = True
ম্যাট

13

আপনি এক লাইনে এটি করতে পারেন এবং একবার যেতে পারেন:

df.drop([col for col in df.columns if "Unnamed" in col], axis=1, inplace=True)

এটিতে উপরের সমাধানগুলির চেয়ে কম ঘুরতে / অনুলিপি করা জড়িত।


11

এই সমাধানটি এখনও কোথাও উল্লেখ করা হয়েছে কিনা তা নিশ্চিত নন তবে করণীয় একটি উপায় pandas.Index.difference

>>> df = pd.DataFrame(columns=['A','B','C','D'])
>>> df
Empty DataFrame
Columns: [A, B, C, D]
Index: []
>>> to_remove = ['A','C']
>>> df = df[df.columns.difference(to_remove)]
>>> df
Empty DataFrame
Columns: [B, D]
Index: []

4

অক্ষটি 0 বা 1 হিসাবে নির্দিষ্ট করে আপনি কেবল তালিকা হিসাবে কলামের নামগুলি পাস করতে পারেন

  • অক্ষ = 1: সারি বরাবর
  • অক্ষ = 0: কলামগুলি বরাবর
  • ডিফল্ট অক্ষ দ্বারা = 0

    data.drop(["Colname1","Colname2","Colname3","Colname4"],axis=1)


4

সহজ এবং সহজ। 22 তম পরে সমস্ত কলাম সরান।

df.drop(columns=df.columns[22:]) # love it

dfজায়গায় পরিবর্তন করতে , পতাকাটি যুক্ত করুন inplace=True, যাতেdf.drop(columns=df.columns[22:], inplace=True)

1

নীচে আমার জন্য কাজ করেছে:

for col in df:
    if 'Unnamed' in col:
        #del df[col]
        print col
        try:
            df.drop(col, axis=1, inplace=True)
        except Exception:
            pass

0

df = df[[col for col in df.columns if not ('Unnamed' in col)]]


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