পান্ডাস: সমস্ত কলাম নির্বাচন করার সর্বোত্তম উপায় যার নাম এক্স দিয়ে শুরু হয়


111

আমার একটি ডেটা ফ্রেম রয়েছে:

import pandas as pd
import numpy as np

df = pd.DataFrame({'foo.aa': [1, 2.1, np.nan, 4.7, 5.6, 6.8],
                   'foo.fighters': [0, 1, np.nan, 0, 0, 0],
                   'foo.bars': [0, 0, 0, 0, 0, 1],
                   'bar.baz': [5, 5, 6, 5, 5.6, 6.8],
                   'foo.fox': [2, 4, 1, 0, 0, 5],
                   'nas.foo': ['NA', 0, 1, 0, 0, 0],
                   'foo.manchu': ['NA', 0, 0, 0, 0, 0],})

আমি কলাম দিয়ে শুরু করে 1 এর মান নির্বাচন করতে চাই foo.। এটি ছাড়া আর কি ভাল করার উপায় আছে:

df2 = df[(df['foo.aa'] == 1)|
(df['foo.fighters'] == 1)|
(df['foo.bars'] == 1)|
(df['foo.fox'] == 1)|
(df['foo.manchu'] == 1)
]

এরকম কিছু লেখার মতো কিছু:

df2= df[df.STARTS_WITH_FOO == 1]

উত্তরের মতো একটি ডেটা ফ্রেম প্রিন্ট করা উচিত:

   bar.baz  foo.aa  foo.bars  foo.fighters  foo.fox foo.manchu nas.foo
0      5.0     1.0         0             0        2         NA      NA
1      5.0     2.1         0             1        4          0       0
2      6.0     NaN         0           NaN        1          0       1
5      6.8     6.8         1             0        5          0       0

[4 rows x 7 columns]

উত্তর:


164

আপনার কলামগুলি তৈরি করতে কেবল একটি তালিকা উপলব্ধি সম্পাদন করুন:

In [28]:

filter_col = [col for col in df if col.startswith('foo')]
filter_col
Out[28]:
['foo.aa', 'foo.bars', 'foo.fighters', 'foo.fox', 'foo.manchu']
In [29]:

df[filter_col]
Out[29]:
   foo.aa  foo.bars  foo.fighters  foo.fox foo.manchu
0     1.0         0             0        2         NA
1     2.1         0             1        4          0
2     NaN         0           NaN        1          0
3     4.7         0             0        0          0
4     5.6         0             0        0          0
5     6.8         1             0        5          0

আর একটি পদ্ধতি হ'ল কলামগুলি থেকে একটি সিরিজ তৈরি করা এবং ভেক্টরাইজড স্ট্রেড পদ্ধতিটি ব্যবহার করা startswith:

In [33]:

df[df.columns[pd.Series(df.columns).str.startswith('foo')]]
Out[33]:
   foo.aa  foo.bars  foo.fighters  foo.fox foo.manchu
0     1.0         0             0        2         NA
1     2.1         0             1        4          0
2     NaN         0           NaN        1          0
3     4.7         0             0        0          0
4     5.6         0             0        0          0
5     6.8         1             0        5          0

আপনি যা চান তা অর্জন করতে আপনার ==1মানদণ্ডগুলি পূরণ করে না এমন মানগুলি ফিল্টার করার জন্য আপনাকে নিম্নলিখিতগুলি যুক্ত করতে হবে :

In [36]:

df[df[df.columns[pd.Series(df.columns).str.startswith('foo')]]==1]
Out[36]:
   bar.baz  foo.aa  foo.bars  foo.fighters  foo.fox foo.manchu nas.foo
0      NaN       1       NaN           NaN      NaN        NaN     NaN
1      NaN     NaN       NaN             1      NaN        NaN     NaN
2      NaN     NaN       NaN           NaN        1        NaN     NaN
3      NaN     NaN       NaN           NaN      NaN        NaN     NaN
4      NaN     NaN       NaN           NaN      NaN        NaN     NaN
5      NaN     NaN         1           NaN      NaN        NaN     NaN

সম্পাদনা

আপনি বিভ্রান্ত উত্তরটি কী চান তা দেখার পরে ঠিক এটি হল:

In [72]:

df.loc[df[df[df.columns[pd.Series(df.columns).str.startswith('foo')]] == 1].dropna(how='all', axis=0).index]
Out[72]:
   bar.baz  foo.aa  foo.bars  foo.fighters  foo.fox foo.manchu nas.foo
0      5.0     1.0         0             0        2         NA      NA
1      5.0     2.1         0             1        4          0       0
2      6.0     NaN         0           NaN        1          0       1
5      6.8     6.8         1             0        5          0       0

69

এখন যে পান্ডাস সূচকগুলি স্ট্রিং অপারেশনগুলিকে সমর্থন করে, তত যুক্তিযুক্তভাবে 'foo' দিয়ে শুরু করে কলামগুলি নির্বাচন করার সহজ উপায়:

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

বিকল্পভাবে, আপনি কলাম (বা সারি) সহ লেবেলগুলি ফিল্টার করতে পারেন df.filter()। নামগুলি দিয়ে শুরু করে নিয়মিত এক্সপ্রেশন নির্দিষ্ট করতে foo.:

>>> df.filter(regex=r'^foo\.', axis=1)
   foo.aa  foo.bars  foo.fighters  foo.fox foo.manchu
0     1.0         0             0        2         NA
1     2.1         0             1        4          0
2     NaN         0           NaN        1          0
3     4.7         0             0        0          0
4     5.6         0             0        0          0
5     6.8         1             0        5          0

কেবলমাত্র প্রয়োজনীয় সারি (ক 1) যুক্ত এবং কলামগুলি locনির্বাচন করতে, আপনি filter(বা অন্য কোনও পদ্ধতি) ব্যবহার করে কলামগুলি নির্বাচন করে এবং সারিগুলি ব্যবহার করতে পারেন any:

>>> df.loc[(df == 1).any(axis=1), df.filter(regex=r'^foo\.', axis=1).columns]
   foo.aa  foo.bars  foo.fighters  foo.fox foo.manchu
0     1.0         0             0        2         NA
1     2.1         0             1        4          0
2     NaN         0           NaN        1          0
5     6.8         1             0        5          0

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


2

@ এডচমের উত্তরের ভিত্তিতে, আপনি নিম্নলিখিত সমাধানটি চেষ্টা করতে পারেন:

df[df.columns[pd.Series(df.columns).str.contains("foo")]]

আপনি যে কলামগুলি দিয়ে শুরু করতে চান তা নির্বাচন না করার ক্ষেত্রে এটি সত্যিই সহায়ক হবে foo। এই পদ্ধতিটি সমস্ত কলামগুলিকে নির্বাচন করে যাতে স্ট্রিং থাকে fooএবং এটি একটি কলামের নামের যে কোনও বিন্দুতে স্থাপন করা যেতে পারে।

সংক্ষেপে, আমি .startswith()সঙ্গে প্রতিস্থাপন .contains()


1

"Foo" দিয়ে শুরু হওয়া কলামগুলি ফিল্টার করার জন্য আপনি এখানে রেজেক্স চেষ্টা করতে পারেন

df.filter(regex='^foo*')

আপনার কলামে যদি আপনার স্ট্রিং ফু রাখতে হয়

df.filter(regex='foo*')

উপযুক্ত হবে।

পরবর্তী পদক্ষেপের জন্য, আপনি ব্যবহার করতে পারেন

df[df.filter(regex='^foo*').values==1]

'foo *' কলামের মানগুলির 1 হ'ল সারিগুলিকে ফিল্টার করতে।


0

আমার সমাধান। পারফরম্যান্সে এটি ধীর হতে পারে:

a = pd.concat(df[df[c] == 1] for c in df.columns if c.startswith('foo'))
a.sort_index()


   bar.baz  foo.aa  foo.bars  foo.fighters  foo.fox foo.manchu nas.foo
0      5.0     1.0         0             0        2         NA      NA
1      5.0     2.1         0             1        4          0       0
2      6.0     NaN         0           NaN        1          0       1
5      6.8     6.8         1             0        5          0       0

0

পছন্দসই এন্ট্রিগুলি নির্বাচনের জন্য অন্য বিকল্পটি হ'ল map:

df.loc[(df == 1).any(axis=1), df.columns.map(lambda x: x.startswith('foo'))]

যা আপনাকে সারিগুলির জন্য সমস্ত কলাম দেয় যা এতে রয়েছে 1:

   foo.aa  foo.bars  foo.fighters  foo.fox foo.manchu
0     1.0         0             0        2         NA
1     2.1         0             1        4          0
2     NaN         0           NaN        1          0
5     6.8         1             0        5          0

সারি নির্বাচন দ্বারা সম্পন্ন করা হয়

(df == 1).any(axis=1)

@ আজকারের উত্তর হিসাবে যা আপনাকে দেয়:

0     True
1     True
2     True
3    False
4    False
5     True
dtype: bool

এর অর্থ এই সারিতে 3এবং 4এতে একটি নেই 1এবং এটি নির্বাচিত হবে না।

কলাম নির্বাচন ভালো বুলিয়ান ইন্ডেক্স ব্যবহার করা হয়:

df.columns.map(lambda x: x.startswith('foo'))

উপরে এই উদাহরণে

array([False,  True,  True,  True,  True,  True, False], dtype=bool)

সুতরাং, যদি কোনও কলামটি শুরু না হয় foo, Falseফিরে আসে এবং কলামটি নির্বাচিত না হয়।

1আপনার কাঙ্ক্ষিত আউটপুট থেকে বোঝা যায় - আপনি যদি কেবল একটি সজ্জিত সমস্ত সারি ফিরিয়ে দিতে চান - আপনি কেবল তা করতে পারেন

df.loc[(df == 1).any(axis=1)]

যা ফিরে আসে

   bar.baz  foo.aa  foo.bars  foo.fighters  foo.fox foo.manchu nas.foo
0      5.0     1.0         0             0        2         NA      NA
1      5.0     2.1         0             1        4          0       0
2      6.0     NaN         0           NaN        1          0       1
5      6.8     6.8         1             0        5          0       0

0

আমার ক্ষেত্রে আমার উপসর্গের একটি তালিকা প্রয়োজন

colsToScale=["production", "test", "development"]
dc[dc.columns[dc.columns.str.startswith(tuple(colsToScale))]]
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.