কলামগুলি ড্রপ করুন যার নামটিতে পান্ডাস ডেটা ফ্রেম থেকে একটি নির্দিষ্ট স্ট্রিং রয়েছে


112

নিম্নলিখিত কলামের নাম সহ আমার কাছে একটি পান্ডাস ডেটা ফ্রেম রয়েছে:

ফলাফল 1, টেস্ট 1, ফলাফল 2, টেস্ট 2, ফলাফল 3, টেস্ট 3, ইত্যাদি ...

আমি সমস্ত কলামগুলি বাদ দিতে চাই যার নামটিতে "টেস্ট" শব্দটি রয়েছে। এই জাতীয় কলামগুলির সংখ্যা স্থিতিশীল নয় তবে এটি পূর্ববর্তী ফাংশনের উপর নির্ভর করে।

আমি এটা কিভাবে করবো?

উত্তর:


79
import pandas as pd

import numpy as np

array=np.random.random((2,4))

df=pd.DataFrame(array, columns=('Test1', 'toto', 'test2', 'riri'))

print df

      Test1      toto     test2      riri
0  0.923249  0.572528  0.845464  0.144891
1  0.020438  0.332540  0.144455  0.741412

cols = [c for c in df.columns if c.lower()[:4] != 'test']

df=df[cols]

print df
       toto      riri
0  0.572528  0.144891
1  0.332540  0.741412

4
ওপি নির্দিষ্ট করে দেয় নি যে অপসারণের ক্ষেত্রে সংবেদনশীল হওয়া উচিত।
ফিলিপ মেঘ

177

এটি করার একটি উপায় এখানে:

df = df[df.columns.drop(list(df.filter(regex='Test')))]

50
বা সরাসরি জায়গায়:df.drop(list(df.filter(regex = 'Test')), axis = 1, inplace = True)
এক্সেল

7
এটি গৃহীত উত্তরের চেয়ে অনেক বেশি মার্জিত সমাধান। মূলত list(df.filter(regex='Test'))লাইনটি কী করছে তা আরও ভালভাবে দেখানোর জন্য এক্সট্র্যাক্ট করে দেখানোর জন্য আমি এটি আরও কিছুটা ভেঙে দেব । আমি df.filter(regex='Test').columnsওভার তালিকা রূপান্তরটিও বেছে নেব
চার্লস

4
এটি এক স্বীকৃত উত্তরের চেয়ে আরও মার্জিত।
গভীরতর করুন

4
আমি সত্যিই আশ্চর্য হই যে এই উত্তরটি বলার মতামতগুলির অর্থ "মার্জিত" এর অর্থ কী। পাইথন কোডটি প্রথমে পাঠযোগ্য হওয়া উচিত বলে আমি নিজে এটি বেশ অবহেলিত মনে করি। এটি প্রথম উত্তরের চেয়ে দ্বিগুণ ধীর। এবং এটি regexকীওয়ার্ডটি ব্যবহার করে যখন likeকীওয়ার্ডটি আরও পর্যাপ্ত বলে মনে হয়।
জ্যাকোকট

4
এটি আসলে দাবি হিসাবে উত্তম উত্তর নয়। সমস্যাটি filterহ'ল এটি আপনার যে সমস্ত কলামগুলি ড্রপ করতে চান সেগুলি হিসাবে সমস্ত ডেটার অনুলিপি দেয় । যদি আপনি কেবল এই ফলাফলটি পাস করেন drop(তবে এটি আবার একটি অনুলিপি দেয়) তবে এটি অপব্যয়কর ... আরও ভাল সমাধান হতে পারে str.startswith(আমি এখানে একটি উত্তর যুক্ত করেছি )।
CS95

45

সস্তা, দ্রুত এবং আইডোমেটিক: str.contains

পান্ডাসের সাম্প্রতিক সংস্করণগুলিতে, আপনি সূচি এবং কলামগুলিতে স্ট্রিং পদ্ধতি ব্যবহার করতে পারেন। এখানে, str.startswithএকটি ভাল ফিট মত মনে হচ্ছে।

প্রদত্ত সাবস্ট্রিং দিয়ে শুরু করে সমস্ত কলাম সরিয়ে ফেলতে:

df.columns.str.startswith('Test')
# array([ True, False, False, False])

df.loc[:,~df.columns.str.startswith('Test')]

  toto test2 riri
0    x     x    x
1    x     x    x

কেস-সংবেদনশীল মিলের জন্য, আপনি str.containsএকটি এসওএল অ্যাঙ্কারের সাথে রিজেক্স-ভিত্তিক মিলটি ব্যবহার করতে পারেন :

df.columns.str.contains('^test', case=False)
# array([ True, False,  True, False])

df.loc[:,~df.columns.str.contains('^test', case=False)] 

  toto riri
0    x    x
1    x    x

যদি মিশ্র প্রকারের সম্ভাবনা থাকে তবে na=Falseপাশাপাশি উল্লেখ করুন ।


15

'ফিল্টার' ব্যবহার করে আপনি যে কলামগুলি চান তা আপনি ফিল্টার করতে পারেন

import pandas as pd
import numpy as np

data2 = [{'test2': 1, 'result1': 2}, {'test': 5, 'result34': 10, 'c': 20}]

df = pd.DataFrame(data2)

df

    c   result1     result34    test    test2
0   NaN     2.0     NaN     NaN     1.0
1   20.0    NaN     10.0    5.0     NaN

এখন ফিল্টার

df.filter(like='result',axis=1)

পাওয়া..

   result1  result34
0   2.0     NaN
1   NaN     10.0

4
সেরা উত্তর! ধন্যবাদ আপনি কিভাবে বিপরীতে ফিল্টার করবেন? not like='result'
stallingOne

4
তারপরে এটি করুন: df = df.DP (df.filter (যেমন = 'ফলাফল', অক্ষ = 1)। কলামগুলি, অক্ষ = 1)
আমির


9

DataFrame.selectপদ্ধতিটি ব্যবহার করুন :

In [38]: df = DataFrame({'Test1': randn(10), 'Test2': randn(10), 'awesome': randn(10)})

In [39]: df.select(lambda x: not re.search('Test\d+', x), axis=1)
Out[39]:
   awesome
0    1.215
1    1.247
2    0.142
3    0.169
4    0.137
5   -0.971
6    0.736
7    0.214
8    0.111
9   -0.214

এবং অপ্টটি নির্দিষ্ট করে দেয় নি যে কোনও সংখ্যক 'টেস্ট' অনুসরণ করতে হয়েছিল: আমি সমস্ত কলামগুলি বাদ দিতে চাই যার নামটিতে "টেস্ট" শব্দটি রয়েছে
7stud

একটি সংখ্যা টেস্ট অনুসরণ করে এমন ধারণাটি পুরোপুরি যুক্তিসঙ্গত। প্রশ্ন আবার পড়ুন।
ফিলিপ মেঘ

4
এখন দেখছেন:FutureWarning: 'select' is deprecated and will be removed in a future release. You can use .loc[labels.map(crit)] as a replacement
flutefreak7

import reআগে থেকে মনে রাখবেন ।
আইজোসেফ

5

এই পদ্ধতিটি জায়গায় সবকিছু করে। অন্যান্য উত্তরগুলির অনেকগুলি অনুলিপি তৈরি করে এবং তত দক্ষ নয়:

df.drop(df.columns[df.columns.str.contains('Test')], axis=1, inplace=True)



1

সবচেয়ে সংক্ষিপ্ততম উপায় হ'ল:

resdf = df.filter(like='Test',axis=1)

এটি ইতিমধ্যে এই উত্তরটি দ্বারা আবৃত ছিল ।
জিনো মেম্পিন

4
উপরের মন্তব্যে লিঙ্কিত উত্তর একইরকম হলেও এটি একই নয়। আসলে, এটি প্রায় বিপরীত।
মাকেন

1

প্রশ্নে বলা হয়েছে 'আমি সমস্ত কলামগুলি বাদ দিতে চাই যার নামটিতে "টেস্ট" শব্দটি রয়েছে'

test_columns = [col for col in df if 'Test' in col]
df.drop(columns=test_columns, inplace=True)

0

রেজেজ সহ কলামের নামের তালিকা ছেড়ে দেওয়ার সময় সমাধান। আমি এই পদ্ধতির পছন্দ করি কারণ আমি ঘন ঘন ড্রপ তালিকা সম্পাদনা করি। ড্রপ তালিকার জন্য নেতিবাচক ফিল্টার রেজেক্স ব্যবহার করে।

drop_column_names = ['A','B.+','C.*']
drop_columns_regex = '^(?!(?:'+'|'.join(drop_column_names)+')$)'
print('Dropping columns:',', '.join([c for c in df.columns if re.search(drop_columns_regex,c)]))
df = df.filter(regex=drop_columns_regex,axis=1)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.