पंडों - किसी दिए गए कॉलम की पहली पंक्ति मान प्राप्त करें


299

यह एक हास्यास्पद आसान सवाल की तरह लगता है ... लेकिन मैं उस आसान उत्तर को नहीं देख रहा हूं जिसकी मुझे उम्मीद थी।

तो, मुझे पंडों में दिए गए कॉलम की nth पंक्ति पर मान कैसे मिलेगा? (मैं पहली पंक्ति में विशेष रूप से दिलचस्पी रखता हूं, लेकिन साथ ही साथ एक अधिक सामान्य अभ्यास में भी रुचि रखता हूं)।

उदाहरण के लिए, मान लें कि मैं BIME को एक चर के रूप में 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जैसा कि unutbu द्वारा उत्तर दिया गया है
EdChum

1
क्या आप सिर्फ मूल्य 1.2चाहते हैं? या लंबाई 1 की श्रृंखला जो आपको मिलती है df_test.head(1), जिसमें सूचकांक भी होगा? बस मूल्य प्राप्त करने के लिए df_test.head(1).item(), या tolist()फिर टुकड़ा करें।
5

जवाबों:


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']: के बीच एक अंतर है

DataFrames स्तंभ-आधारित ब्लॉकों में डेटा संग्रहीत करता है (जहां प्रत्येक ब्लॉक में एक एकल dtype है)। यदि आप पहले कॉलम द्वारा चयन करते हैं, तो एक दृश्य लौटाया जा सकता है (जो कॉपी वापस करने की तुलना में तेज है) और मूल dtype संरक्षित है। इसके विपरीत, आप पहली पंक्ति आधार पर चुनते हैं और यदि DataFrame अलग dtypes के स्तंभ हैं, तो पांडा प्रतियां वस्तु 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 (की सिफारिश की):

डेटाफ़्रेम को नए मान निर्दिष्ट करने का अनुशंसित तरीका जंजीर अनुक्रमण से बचने के लिए है , और इसके बजाय andrew द्वारा दिखाए गए विधि का उपयोग करें ,

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 काम करता है, लेकिन अनुशंसित नहीं है:

यद्यपि यह काम करता है, यह उस तरह से लाभ उठा रहा है जिस तरह से DataFrames वर्तमान में कार्यान्वित किया जाता है। इसमें कोई दोराय नहीं है कि पंडों को भविष्य में इस तरह से काम करना होगा। विशेष रूप से, यह इस तथ्य का लाभ उठा रहा है कि (वर्तमान में) df['Btime']हमेशा एक दृश्य देता है (प्रतिलिपि नहीं) इसलिए df['Btime'].iloc[n] = xइसका उपयोग स्तंभ के nth स्थान पर एक नया मान असाइन करने के लिए किया जा सकता Btimeहै df

चूंकि इंडेक्स बनाम कॉपी में व्यूज वापस करने के बारे में पंडों ने कोई स्पष्ट गारंटी नहीं दी है, अतः जंजीर इंडेक्सिंग का उपयोग करने वाले असाइनमेंट आमतौर पर हमेशा बढ़ते हैं 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के बाद से मूल्य ixसे सूचकांक करने के लिए कोशिश करता लेबल द्वारा सूचकांक करने के लिए प्रयास करने से पहले स्थिति । इसलिए यदि DataFrame में पूर्णांक सूचकांक है जो 0 से शुरू होने वाले क्रमबद्ध क्रम में नहीं है, तो उपयोग ix[i]करने से पंक्ति के i बजाय लेबल वाली पंक्ति वापस आ जाएगी ith। उदाहरण के लिए,

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
@CristianCiupitu: DataFrames स्तंभ-आधारित ब्लॉकों में डेटा संग्रहीत करता है (जहां प्रत्येक ब्लॉक में एक ही प्रकार होता है)। यदि आप पहले कॉलम का चयन करते हैं, तो एक दृश्य लौटाया जा सकता है (जो कॉपी वापस करने की तुलना में जल्दी है) और मूल dtype संरक्षित है। इसके विपरीत, आप पहली पंक्ति आधार पर चुनते हैं और यदि DataFrame अलग dtypes के स्तंभ हैं, तो पांडा प्रतियां वस्तु dtype की एक नई श्रृंखला में डेटा। इसलिए पंक्तियों का चयन करना पंक्तियों को चुनने की तुलना में थोड़ा तेज है। इस प्रकार, हालांकि df_test.iloc[0]['Btime']काम करता है, df_test.iloc['Btime'][0]थोड़ा अधिक कुशल है।
unutbu

@unutbu, को df['Btime'].iloc[0]प्राथमिकता दी जाती है df['Btime'].values[0]? मैं उस दस्तावेज़ से देख सकता हूँ जो कहता है कि "चेतावनी: हम Series.array या Series.to_numpy () का उपयोग करने की सलाह देते हैं, इस पर निर्भर करता है कि आपको अंतर्निहित डेटा या एक NumPy सरणी के संदर्भ की आवश्यकता है या नहीं।" लेकिन मुझे यकीन नहीं है कि इसका क्या मतलब है
aydow

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
@anis: इस उद्देश्य के लिए, आप अधिक सामान्य समाधान के लिए एक नया प्रश्न लिख रहे होंगे और इसका उत्तर अपने दम पर देंगे, मुझे विश्वास है।
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.
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.