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'
df_test.head(1)
काम करेंगे, और अधिक सामान्य रूप का उपयोग करना हैiloc
जैसा कि unutbu द्वारा उत्तर दिया गया है