পান্ডস - প্রদত্ত কলামের প্রথম সারির মানটি পান


299

এটি একটি হাস্যকর প্রশ্ন হিসাবে মনে হচ্ছে ... তবে আমি যে সহজ উত্তরটি আশা করছিলাম তা দেখছি না।

সুতরাং, পান্ডসে প্রদত্ত কলামের নবম সারিতে আমি কীভাবে মূল্য পেতে পারি? (আমি প্রথম সারিতে বিশেষত আগ্রহী, তবে আরও সাধারণ অনুশীলনেও আগ্রহী করব)।

উদাহরণস্বরূপ, ধরা যাক আমি ভেরিয়েবল হিসাবে বিটিমে 1.2 মান টানতে চাই।

এটি করার সঠিক উপায় কী?

df_test =

  ATime   X   Y   Z   Btime  C   D   E
0    1.2  2  15   2    1.2  12  25  12
1    1.4  3  12   1    1.3  13  22  11
2    1.5  1  10   6    1.4  11  20  16
3    1.6  2   9  10    1.7  12  29  12
4    1.9  1   1   9    1.9  11  21  19
5    2.0  0   0   0    2.0   8  10  11
6    2.4  0   0   0    2.4  10  12  15

7
আপনি যদি কেবল প্রথম সারির সন্ধান করতে চান তবে df_test.head(1)কাজ করবে, ilocআনতবু দ্বারা উত্তর হিসাবে আরও সাধারণ ফর্মটি ব্যবহার করা হবে
এডচাম

1
আপনি কি শুধু মান চান 1.2? বা আপনি যে দৈর্ঘ্যের 1 সিরিজটি পাবেন তার সাথে df_test.head(1)সূচকটিও থাকবে? শুধু মানটি পেতে df_test.head(1).item(), বা tolist()তারপরে স্লাইস করুন।
স্মি

উত্তর:


469

ithসারিটি নির্বাচন করতে , ব্যবহার করুনiloc :

In [31]: df_test.iloc[0]
Out[31]: 
ATime     1.2
X         2.0
Y        15.0
Z         2.0
Btime     1.2
C        12.0
D        25.0
E        12.0
Name: 0, dtype: float64

Btimeকলামটিতে ith মানটি নির্বাচন করতে আপনি ব্যবহার করতে পারেন:

In [30]: df_test['Btime'].iloc[0]
Out[30]: 1.2

df_test['Btime'].iloc[0](প্রস্তাবিত) এবং এর মধ্যে পার্থক্য রয়েছেdf_test.iloc[0]['Btime'] : এর

ডেটাফ্রেমগুলি কলাম-ভিত্তিক ব্লকগুলিতে ডেটা সঞ্চয় করে (যেখানে প্রতিটি ব্লকের একক dtype থাকে)। আপনি যদি প্রথম কলাম দ্বারা নির্বাচন করেন তবে একটি ভিউ ফেরত দেওয়া যাবে (যা একটি অনুলিপি ফেরত দেওয়ার চেয়ে দ্রুত) এবং মূল টাইপটি সংরক্ষণ করা হবে। বিপরীতে, আপনি যদি প্রথমে সারি দ্বারা নির্বাচন করেন এবং যদি ডেটাফ্রেমে বিভিন্ন ধরণের টাইপের কলাম থাকে, তবে পান্ডস ডেটাটি অবজেক্ট dtype এর একটি নতুন সিরিজে অনুলিপি করে। সুতরাং কলামগুলি নির্বাচন করা সারি নির্বাচনের চেয়ে কিছুটা দ্রুত। সুতরাং, যদিও df_test.iloc[0]['Btime']কাজ করে, df_test['Btime'].iloc[0]কিছুটা বেশি দক্ষ।

যখন দায়িত্ব অর্পণ করা হয় তখন দুজনের মধ্যে একটি বড় পার্থক্য রয়েছে। df_test['Btime'].iloc[0] = xপ্রভাবিত করে df_test, কিন্তু df_test.iloc[0]['Btime'] না পারে। কেন একটি ব্যাখ্যা জন্য নীচে দেখুন। ইনডেক্সিংয়ের ক্রমের একটি সূক্ষ্ম পার্থক্য আচরণে একটি বড় পার্থক্য তৈরি করে, একক সূচীকরণ কার্যনির্বাহী ব্যবহার করা আরও ভাল:

df.iloc[0, df.columns.get_loc('Btime')] = x

df.iloc[0, df.columns.get_loc('Btime')] = x (প্রস্তাবিত):

প্রস্তাবিত উপায় একটি DataFrame নির্ধারিত নতুন মান হয় শৃঙ্খলিত ইন্ডেক্স এড়াতে , এবং পরিবর্তে পদ্ধতি ব্যবহার অ্যান্ড্রু দ্বারা প্রদর্শিত ,

df.loc[df.index[n], 'Btime'] = x

অথবা

df.iloc[n, df.columns.get_loc('Btime')] = x

পরবর্তী পদ্ধতিটি কিছুটা দ্রুত, কারণ df.locসারি এবং কলামের লেবেলগুলিকে অবস্থানীয় সূচকগুলিতে রূপান্তর করতে হয়, সুতরাং df.ilocপরিবর্তে আপনি যদি ব্যবহার করেন তবে কিছুটা কম রূপান্তর প্রয়োজন ।


df['Btime'].iloc[0] = x কাজ করে, তবে সুপারিশ করা হয় না:

যদিও এটি কাজ করে, বর্তমানে এটি ডেটা ফ্রেমগুলি যেভাবে প্রয়োগ করা হচ্ছে সেটার সুযোগ নিয়েছে । ভবিষ্যতে পান্ডাদের এভাবে কাজ করতে হবে এমন কোনও গ্যারান্টি নেই। বিশেষত, এটি এই সুবিধাটি গ্রহণ করছে যে (বর্তমানে) df['Btime']সর্বদা একটি দর্শন দেয় (অনুলিপিটি নয়) তাই এর কলামের নবম স্থানে একটি নতুন মান নির্ধারণdf['Btime'].iloc[n] = x করতে ব্যবহার করা যেতে পারে ।Btimedf

যেহেতু পান্ডারা সূচকগুলি যখন অনুলিপি তুলনায় কোনও ভিউ ফেরত দেয় সে সম্পর্কে কোনও স্পষ্ট গ্যারান্টি দেয় না, শৃঙ্খলাবদ্ধ সূচক ব্যবহার করা কার্যাদি সাধারণত সর্বদা একটি উত্থাপন করে SettingWithCopyWarningযদিও এই ক্ষেত্রে অ্যাসাইনমেন্টটি সংশোধন করতে সফল হয় df:

In [22]: df = pd.DataFrame({'foo':list('ABC')}, index=[0,2,1])
In [24]: df['bar'] = 100
In [25]: df['bar'].iloc[0] = 99
/home/unutbu/data/binky/bin/ipython:1: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
  self._setitem_with_indexer(indexer, value)

In [26]: df
Out[26]: 
  foo  bar
0   A   99  <-- assignment succeeded
2   B  100
1   C  100

df.iloc[0]['Btime'] = x কাজ করে না:

বিপরীতে, এর সাথে অ্যাসাইনমেন্ট df.iloc[0]['bar'] = 123কাজ করে না কারণ df.iloc[0]একটি অনুলিপি প্রদান করছে:

In [66]: df.iloc[0]['bar'] = 123
/home/unutbu/data/binky/bin/ipython:1: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy

In [67]: df
Out[67]: 
  foo  bar
0   A   99  <-- assignment failed
2   B  100
1   C  100

সতর্কতা : আমি আগে পরামর্শ দিয়েছিলাম df_test.ix[i, 'Btime']। তবে অবস্থান অনুসারে সূচকে চেষ্টা করার আগে লেবেল অনুসারে সূচকে চেষ্টা করার ithকারণে এটি আপনাকে মূল্য দেওয়ার গ্যারান্টিযুক্ত নয় । সুতরাং যদি ডেটাফ্রেমের কোনও পূর্ণসংখ্যার সূচক থাকে যা 0 থেকে শুরু অনুসারে বাছাই করা থাকে না, তবে ব্যবহার করে সারিটির পরিবর্তে সারিটির পরিবর্তে লেবেলটি দেওয়া হবে । উদাহরণ স্বরূপ,ixix[i] iith

In [1]: df = pd.DataFrame({'foo':list('ABC')}, index=[0,2,1])

In [2]: df
Out[2]: 
  foo
0   A
2   B
1   C

In [4]: df.ix[1, 'foo']
Out[4]: 'C'

1
@ ক্রিশ্চিয়ানসিপিতু: ডেটাফ্রেমগুলি কলাম-ভিত্তিক ব্লকগুলিতে ডেটা সঞ্চয় করে (যেখানে প্রতিটি ব্লকের একক ধরণের টাইপ থাকে) you আপনি যদি প্রথম কলাম অনুসারে নির্বাচন করেন, তবে একটি ভিউ ফিরে পাওয়া যায় (যা একটি অনুলিপি ফেরানোর চেয়ে দ্রুততর) এবং মূল dtype সংরক্ষণ করা হয়। বিপরীতে, আপনি যদি প্রথমে সারি দ্বারা নির্বাচন করেন এবং যদি ডেটাফ্রেমে বিভিন্ন ধরণের টাইপের কলাম থাকে, তবে পান্ডস ডেটাটি অবজেক্ট dtype এর একটি নতুন সিরিজে অনুলিপি করে। সুতরাং কলামগুলি নির্বাচন করা সারি নির্বাচনের চেয়ে কিছুটা দ্রুত। সুতরাং, যদিও df_test.iloc[0]['Btime']কাজ করে, df_test.iloc['Btime'][0]কিছুটা বেশি দক্ষ।
unutbu

@ ইউন্টবু, df['Btime'].iloc[0]পছন্দ হয় df['Btime'].values[0]? আমি ডকুমেন্টেশন থেকে দেখতে পাচ্ছি যে এটিতে "সতর্কতা: আমরা সিরিজ.আরে বা সিরিজ.টো_মম্পি () ব্যবহার করার পরামর্শ দিচ্ছি, তার উপর নির্ভর করে আপনার অন্তর্নিহিত ডেটা বা নুমপি অ্যারের রেফারেন্স প্রয়োজন কিনা"। তবে আমি তার ঠিক কী তা নিশ্চিত তা নিশ্চিত নই
এডো

28

নোট করুন যে @unutbu থেকে উত্তরটি সঠিক হবে যতক্ষণ না আপনি মানটিকে নতুন কিছুতে সেট করতে চান, তবে আপনার ডেটাফ্রেমটি যদি কোনও মতামত হয় তবে এটি কাজ করবে না।

In [4]: df = pd.DataFrame({'foo':list('ABC')}, index=[0,2,1])
In [5]: df['bar'] = 100
In [6]: df['bar'].iloc[0] = 99
/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pandas-0.16.0_19_g8d2818e-py2.7-macosx-10.9-x86_64.egg/pandas/core/indexing.py:118: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame

See the the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
  self._setitem_with_indexer(indexer, value)

আরেকটি পদ্ধতি যা নিয়মিতভাবে সেটিংস এবং প্রাপ্ত উভয় ক্ষেত্রেই কাজ করবে:

In [7]: df.loc[df.index[0], 'foo']
Out[7]: 'A'
In [8]: df.loc[df.index[0], 'bar'] = 99
In [9]: df
Out[9]:
  foo  bar
0   A   99
2   B  100
1   C  100

1
আমি .csv ফাইলগুলির একটি গুচ্ছ দিয়ে লুপ করছি এবং প্রতিটিটিতে একটি নির্দিষ্ট কলামের প্রথম মানটি পড়ছি। কোনও কারণে যা আমি মানটি পরিবর্তনের পরিবর্তে ব্যাখ্যা করতে পারি না এটি কখনও কখনও প্রক্রিয়াকরণে গণ্ডগোল করে এমন মানের সাথে সূচকটিও ফেরত দেয়। আমি df.col.unique () [0] অবলম্বন করেছি।
স্প্যারো

15

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

first_value = df['Btime'].values[0]

এই উপায়টি ব্যবহারের চেয়ে দ্রুততর বলে মনে হচ্ছে .iloc:

In [1]: %timeit -n 1000 df['Btime'].values[20]
5.82 µs ± 142 ns per loop (mean ± std. dev. of 7 runs, 1000 loops each)

In [2]: %timeit -n 1000 df['Btime'].iloc[20]
29.2 µs ± 1.28 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

12
  1. df.iloc[0].head(1) - প্রথম ডেটা কেবল প্রথম প্রথম সারিতে সেট করা।
  2. df.iloc[0] - কলামে সম্পূর্ণ প্রথম সারির।

8

একটি সাধারণ ভাবে, যদি আপনি প্রথম কুড়ান করতে চান এন সারি থেকে জে কলাম থেকে pandas dataframeএই কাজ করতে সবচেয়ে ভালো উপায় হল:

data = dataframe[0:N][:,J]

2
@ আনিস: এই উদ্দেশ্যে আপনি আরও একটি সাধারণ প্রশ্ন আরও ভাল সমাধানের জন্য জিজ্ঞাসা করে নিজেই উত্তর দিয়ে দিতে পারতেন, আমি বিশ্বাস করি।
jonathan.scholbach

3

উদাহরণস্বরূপ কলাম 'পরীক্ষা' এবং সারি 1 থেকে মানটি পেতে এটির মতো কাজ করে

df[['test']].values[0][0]

যেমন df[['test']].values[0]একটি অ্যারে ফিরে দেয়


1

প্রথম সারিটি পাওয়ার এবং সূচকটি সংরক্ষণের আরেকটি উপায়:

x = df.first('d') # Returns the first day. '3d' gives first three days.
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.