পান্ডায় ডেটাফ্রেমের কলাম-স্লাইস কীভাবে গ্রহণ করবেন


264

আমি একটি সিএসভি ফাইল থেকে কিছু মেশিন লার্নিং ডেটা লোড করি। প্রথম 2 টি কলাম পর্যবেক্ষণ এবং বাকী কলামগুলি বৈশিষ্ট্য।

বর্তমানে, আমি নিম্নলিখিতগুলি করি:

data = pandas.read_csv('mydata.csv')

যা এরকম কিছু দেয়:

data = pandas.DataFrame(np.random.rand(10,5), columns = list('abcde'))

আমি দুই dataframes এই dataframe যেভাবেই চাই: এক কলাম ধারণকারী aএবং bএবং এক কলাম ধারণকারী c, dএবং e

এরকম কিছু লেখা সম্ভব নয়

observations = data[:'c']
features = data['c':]

আমি নিশ্চিত না যে সেরা পদ্ধতিটি কী। আমার কি দরকার pd.Panel?

যাইহোক, আমি ডেটাফ্রেম সূচকটি বেশ বেমানান দেখতে পেয়েছি: data['a']অনুমোদিত, তবে data[0]তা নয়। অন্যদিকে, data['a':]অনুমোদিত নয় তবে data[0:]রয়েছে। এর কোন ব্যবহারিক কারণ আছে কি? এটি প্রদান করে কলামগুলি ইন্ট অনুসারে সূচিত হয় তবে তা সত্যিই বিভ্রান্তিকরdata[0] != data[0:1]


3
আপনি যখন ডিএফ করেন তখন ডেটা ফ্রেম সহজাতভাবে একটি ডিকের মতো বস্তু হয় [...] তবে কিছু সুবিধা যেমন, df[5:10]সারি নির্বাচন করার জন্য যুক্ত করা হয়েছিল ( pandas.pydata.org/pandas-docs/stable/… )
ওয়েস ম্যাককিনি

1
সুতরাং এই অসঙ্গতিটি সুবিধার পক্ষে কোনও ডিজাইনের সিদ্ধান্ত কী? ঠিক আছে, তবে এটি অবশ্যই নতুনদের জন্য আরও স্পষ্ট হওয়া দরকার!
সিপিএ

3
সহায়তার সুবিধার নকশা বিবেচনা শিক্ষার বক্ররেখা অনেক খাড়া করে তোলে। আমি আশা করি যে কেবল একটি সামঞ্জস্যপূর্ণ ইন্টারফেস উপস্থাপনের জন্য আরও ভাল ডকুমেন্টেশন রয়েছে। উদাহরণস্বরূপ, কেবলমাত্র ix ইন্টারফেসে ফোকাস করুন।
ইউ শেন

উত্তর:


242

2017 উত্তর - পান্ডাস 0.20: .ix হ্রাস করা হয়েছে। .Loc ব্যবহার করুন

দেখুন ডক্সে থামিয়ে দেওয়া

.locউভয় সারি এবং কলামগুলি নির্বাচন করতে লেবেল ভিত্তিক সূচক ব্যবহার করে। সূচিপত্র বা কলামগুলির মান হিসাবে লেবেলগুলি। এর সাথে কাটা .locশেষ উপাদান অন্তর্ভুক্ত।

আসুন অনুমান আমরা নিম্নলিখিত কলাম সহ একটি DataFrame আছে:
foo, bar, quz, ant, cat, sat, dat

# selects all rows and all columns beginning at 'foo' up to and including 'sat'
df.loc[:, 'foo':'sat']
# foo bar quz ant cat sat

.locপাইথন তালিকাগুলি সারি এবং কলাম উভয়ের জন্যই একই স্লাইস স্বরলিপি গ্রহণ করে। স্লাইস নোটেশন হচ্ছেstart:stop:step

# slice from 'foo' to 'cat' by every 2nd column
df.loc[:, 'foo':'cat':2]
# foo quz cat

# slice from the beginning to 'bar'
df.loc[:, :'bar']
# foo bar

# slice from 'quz' to the end by 3
df.loc[:, 'quz'::3]
# quz sat

# attempt from 'sat' to 'bar'
df.loc[:, 'sat':'bar']
# no columns returned

# slice from 'sat' to 'bar'
df.loc[:, 'sat':'bar':-1]
sat cat ant quz bar

# slice notation is syntatic sugar for the slice function
# slice from 'quz' to the end by 2 with slice function
df.loc[:, slice('quz',None, 2)]
# quz cat dat

# select specific columns with a list
# select columns foo, bar and dat
df.loc[:, ['foo','bar','dat']]
# foo bar dat

আপনি সারি এবং কলামগুলি দিয়ে স্লাইস করতে পারেন। উদাহরণস্বরূপ, আপনি লেবেল সহ 5 টি সারি আছে যদি v, w, x, y,z

# slice from 'w' to 'y' and 'foo' to 'ant' by 3
df.loc['w':'y', 'foo':'ant':3]
#    foo ant
# w
# x
# y

যদি আপনার ব্যবহারটি ল্যাম্বডা সারি দিয়ে প্রয়োগ হয় df['newcol'] = df.apply(lambda row: myfunc(row), axis=1) তবে যেমন: তবে আপনি myfunc(row){... ব্যবহার করতে পারবেন row['foo':'ant']। উদাহরণস্বরূপ ( এই স্ট্যাকওভারফ্লো উত্তর অনুসারে ), এর মধ্যে myfuncআপনি যদি নির্ণয় করতে পারেন যে এর মধ্যে row['foo':'ant'].apply(lambda x: isinstance(x, str)).any()
কোনওটিও

4
.ilocপরিবর্তে, এখন ব্যবহার করা উচিত .loc। এটি ঠিক করুন, এবং আমি এটি upvote করব।
ক্রেন

1
@ ক্রেনড - এটি সঠিক নয়। পান্ডা ডকুমেন্টেশন থেকে: .loc প্রাথমিকভাবে লেবেল ভিত্তিক, তবে এটি বুলিয়ান অ্যারের সাথেও ব্যবহৃত হতে পারে। আইটেমগুলি পাওয়া না গেলে .loc কী-ইরার উত্থাপন করবে। .Iloc ব্যতীত অনুরূপ একটি বিবৃতি দেওয়া হয় এটি বিশেষভাবে সূচক ভিত্তিক স্লাইসিংকে বোঝায়। এই উদাহরণের অন্য কথায়, তিনি লেবেল ভিত্তিক সূচক ব্যবহার করেছিলেন এবং .loc সঠিক পছন্দ (মূলত একমাত্র পছন্দ)। আপনি অবস্থান দ্বারা ফালি করতে চান, উদাহরণস্বরূপ 5:10 -rows, তারপর .iloc ব্যবহার
user2103050

149

দ্রষ্টব্য: .ix পান্ডাস v0.20 সাল থেকে অবহেলা করা হয়েছে। পরিবর্তে আপনার যথাযথ হিসাবে .locবা ব্যবহার করা উচিত .iloc

আপনি যা অ্যাক্সেস করতে চান সেটি ডেটাফ্রেম.িক্স সূচক। এটি কিছুটা বিভ্রান্তিকর (আমি একমত যে পান্ডাস সূচীগুলি মাঝে মাঝে বিভ্রান্ত হয়!) তবে নীচেরগুলি আপনি যা চান তা করতে দেখা যাচ্ছে:

>>> df = DataFrame(np.random.rand(4,5), columns = list('abcde'))
>>> df.ix[:,'b':]
      b         c         d         e
0  0.418762  0.042369  0.869203  0.972314
1  0.991058  0.510228  0.594784  0.534366
2  0.407472  0.259811  0.396664  0.894202
3  0.726168  0.139531  0.324932  0.906575

যেখানে .ix [সারি স্লাইস, কলাম স্লাইস] হ'ল যা ব্যাখ্যা করা হচ্ছে। পান্ডাস সূচকে এখানে আরও: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-advanced


5
যত্নবান যে পান্ডাগুলির মধ্যে রয়েছে উভয় প্রান্তের পয়েন্ট অন্তর্ভুক্ত, যেমন>>>data.ix[:, 'a':'c'] a b c 0 0.859192 0.881433 0.843624 1 0.744979 0.427986 0.177159
তৃণমূল

21
একাধিক কলামের ক্যাবটি df.ix[:,[0,3,4]]
এভাবে

3
@ কারমেল: উপরের আউটপুটটিতে একটি অনুলিপি / পেস্ট ত্রুটির মত দেখাচ্ছে। সম্ভবত আপনি বোঝানো হয়েছে df.ix[:,'b':'e']?
চেইমজি

6
এটা ব্যবহার করা ভালো locপরিবর্তে ix: stackoverflow.com/a/31593712/4323
জন Zwinck

5
এই মত পুরানো উত্তর মুছে ফেলা প্রয়োজন। .ix হ্রাস করা হয় এবং কখনও ব্যবহার করা উচিত নয়।
টেড পেট্রো

75

উদাহরণস্বরূপ সিউর্ন প্যাকেজ থেকে টাইটানিক ডেটাসেট ব্যবহার করতে দিন

# Load dataset (pip install seaborn)
>> import seaborn.apionly as sns
>> titanic = sns.load_dataset('titanic')

কলামের নাম ব্যবহার করে

>> titanic.loc[:,['sex','age','fare']]

কলাম সূচকগুলি ব্যবহার করে

>> titanic.iloc[:,[2,3,6]]

ix ব্যবহার করে (পান্ডাদের চেয়ে পুরানো <.20 সংস্করণ)

>> titanic.ix[:,[‘sex’,’age’,’fare’]]

অথবা

>> titanic.ix[:,[2,3,6]]

রিইনডেক্স পদ্ধতি ব্যবহার করে

>> titanic.reindex(columns=['sex','age','fare'])

6
পান্ডাসে 0.20: হ্রাস করা .ixহয়।
শিহে ঝাং

Passing list-likes to .loc or [] with any missing label will raise KeyError in the future, you can use .reindex() as an alternative.df.loc[:, some_list_of_columns]
অবচয়

35

এছাড়াও, একটি ডেটা ফ্রেম দেওয়া হয়েছে

উপাত্ত

যেমন আপনার উদাহরণ হিসাবে, আপনি যদি কলামটি কেবলমাত্র এবং ডি মাত্রই বের করতে চান (ই প্রথম এবং চতুর্থ কলাম), পান্ডাস ডেটাফ্রেম থেকে আইলোক মথড যা আপনার প্রয়োজন এবং খুব কার্যকরভাবে ব্যবহার করা যেতে পারে। আপনাকে যে কলামগুলি বের করতে চান তার সূচি হ'ল আপনাকে যা জানা দরকার। উদাহরণ স্বরূপ:

>>> data.iloc[:,[0,3]]

তোমাকে দিবে

          a         d
0  0.883283  0.100975
1  0.614313  0.221731
2  0.438963  0.224361
3  0.466078  0.703347
4  0.955285  0.114033
5  0.268443  0.416996
6  0.613241  0.327548
7  0.370784  0.359159
8  0.692708  0.659410
9  0.806624  0.875476

25

DataFrameতালিকার প্রতিটি কলামের নাম উল্লেখ করে আপনি এগুলির কলামগুলি বরাবর স্লাইস করতে পারেন:

data = pandas.DataFrame(np.random.rand(10,5), columns = list('abcde'))
data_ab = data[list('ab')]
data_cde = data[list('cde')]

সুতরাং আমি যদি কলাম 'বি' থেকে শুরু করে সমস্ত ডেটা চাই, আমার ডাটা কোডের কলামগুলিতে 'খ' এর সূচকটি খুঁজে বের করতে হবে এবং ডেটা [ডেটা কলামগুলি [1:]] করা উচিত? এটাই কি অপারেশন করার উপায়?
সিপিএ

1
আপনার অর্থ আপনি 'খ' থেকে সমস্ত কলাম নির্বাচন করতে চান?
ব্রেন্ডন উড

হ্যাঁ, বা প্রদত্ত ব্যাপ্তিতে সমস্ত কলাম নির্বাচন করা।
সিপিএ

আমি নিজেকে প্যান্ডাস করার ক্ষেত্রে বেশ নতুন, তাই সাধারণভাবে কী বিবেচিত তা নিয়ে আমি কথা বলতে পারি না। আপনি যেমনটি বলেছিলেন তেমনই আমি করব, তবে কলাম 'বি' বা যা কিছু হোক তা সূচক নির্ধারণ করতে get_locফাংশনটি ব্যবহার করুন data.columns
ব্রেন্ডন উড

20

এবং যদি আপনি এখানে দুটি স্তরের কলাম বিছিয়ে এবং তাদের একত্রিত করার সন্ধান করতে এসেছিলেন (আমার মতো) তবে আপনি এর মতো কিছু করতে পারেন

op = df[list(df.columns[0:899]) + list(df.columns[3593:])]
print op

এটি প্রথম 900 কলাম এবং (সমস্ত) কলাম> 3593 (ধরে নিলে আপনার ডেটা সেটে 4000 কলাম রয়েছে বলে ধরে নিয়ে) একটি নতুন ডেটাফ্রেম তৈরি করা হবে।


দুর্দান্ত, কেউ এটি চেষ্টা করেছে ... আমি ভাবছিলাম, এই 0: 899 যা প্রথম 900 কলাম পেয়েছে .. তারা কেন এটি এমন করল? এটি পাইথনের মতো মোটেও অনুভব করে না।
অজগরে

14

নির্বাচনের লেবেল ভিত্তিক, সূচক ভিত্তিক এবং নির্বাচনী রেঞ্জ ভিত্তিক কলাম স্লাইসিং সহ আপনি কীভাবে বিভিন্ন পদ্ধতিতে সিলেক্টিভ কলাম স্লাইসিং করতে ব্যবহার করতে পারেন তা এখানে

In [37]: import pandas as pd    
In [38]: import numpy as np
In [43]: df = pd.DataFrame(np.random.rand(4,7), columns = list('abcdefg'))

In [44]: df
Out[44]: 
          a         b         c         d         e         f         g
0  0.409038  0.745497  0.890767  0.945890  0.014655  0.458070  0.786633
1  0.570642  0.181552  0.794599  0.036340  0.907011  0.655237  0.735268
2  0.568440  0.501638  0.186635  0.441445  0.703312  0.187447  0.604305
3  0.679125  0.642817  0.697628  0.391686  0.698381  0.936899  0.101806

In [45]: df.loc[:, ["a", "b", "c"]] ## label based selective column slicing 
Out[45]: 
          a         b         c
0  0.409038  0.745497  0.890767
1  0.570642  0.181552  0.794599
2  0.568440  0.501638  0.186635
3  0.679125  0.642817  0.697628

In [46]: df.loc[:, "a":"c"] ## label based column ranges slicing 
Out[46]: 
          a         b         c
0  0.409038  0.745497  0.890767
1  0.570642  0.181552  0.794599
2  0.568440  0.501638  0.186635
3  0.679125  0.642817  0.697628

In [47]: df.iloc[:, 0:3] ## index based column ranges slicing 
Out[47]: 
          a         b         c
0  0.409038  0.745497  0.890767
1  0.570642  0.181552  0.794599
2  0.568440  0.501638  0.186635
3  0.679125  0.642817  0.697628

### with 2 different column ranges, index based slicing: 
In [49]: df[df.columns[0:1].tolist() + df.columns[1:3].tolist()]
Out[49]: 
          a         b         c
0  0.409038  0.745497  0.890767
1  0.570642  0.181552  0.794599
2  0.568440  0.501638  0.186635
3  0.679125  0.642817  0.697628

দয়া করে একটি উত্তর হিসাবে ডাম্পিং কোড এড়ানোর চেষ্টা করুন এবং এটি কী করে এবং কেন তা ব্যাখ্যা করার চেষ্টা করুন। আপনার কোডগুলি সেই ব্যক্তির পক্ষে সুস্পষ্ট নাও হতে পারে যাদের প্রাসঙ্গিক কোডিংয়ের অভিজ্ঞতা নেই। স্পষ্টতা, প্রসঙ্গ
সাউ অনো


1

যদি ডেটা ফ্রেম এর মতো দেখতে থাকে:

group         name      count
fruit         apple     90
fruit         banana    150
fruit         orange    130
vegetable     broccoli  80
vegetable     kale      70
vegetable     lettuce   125

এবং আউটপুট মত হতে পারে

   group    name  count
0  fruit   apple     90
1  fruit  banana    150
2  fruit  orange    130

যদি আপনি লজিকাল অপারেটর ব্যবহার করেন np.logical_not

df[np.logical_not(df['group'] == 'vegetable')]

আরও সম্পর্কে

https://docs.scipy.org/doc/numpy-1.13.0/reference/routines.logic.html

অন্যান্য লজিকাল অপারেটর

  1. লজিকাল_এন্ড (এক্স 1, এক্স 2, / [, আউট, কোথায়, ...]) এক্স 1 এবং এক্স 2 উপাদান অনুসারে সত্য মান গণনা করুন।

  2. লজিকাল_অর (এক্স 1, এক্স 2, / [, আউট, কোথায়, কাস্টিং, ...]) এক্স 1 বা এক্স 2 উপাদান অনুসারে সত্য মান গণনা করুন।

  3. লজিক্যাল_নট (এক্স, / [, আউট, কোথায়, কাস্টিং, ...]) এক্স-এলিমেন্টের ভিত্তিতে নয় মানের গুণফল গণনা করুন।
  4. লজিক্যাল_এক্সর (এক্স 1, এক্স 2, / [, আউট, কোথায়, ..]) এক্স 1 এক্সওর এক্স 2 এর সত্য মান গণনা করুন, উপাদান অনুসারে।

0

আপনার সমস্ত ফ্রেম সারি চান তা ধরে নিয়ে আপনার ডেটাফ্রেম থেকে কলামগুলির একটি উপসেট পাওয়ার আরও একটি উপায় হ'ল:
data[['a','b']]এবং data[['c','d','e']]
আপনি যদি সংখ্যাসূচক কলাম সূচি ব্যবহার করতে চান তবে আপনি করতে পারেন:
data[data.columns[:2]]এবংdata[data.columns[2:]]

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