ith
Satırı seçmek için şunu kullanıniloc
:
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
Kullanabileceğiniz sütundaki ith değerini seçmek için :
In [30]: df_test['Btime'].iloc[0]
Out[30]: 1.2
df_test['Btime'].iloc[0]
(Önerilen) ile df_test.iloc[0]['Btime']
: arasında bir fark vardır :
DataFrames, verileri sütun tabanlı bloklarda saklar (her blokta tek bir dtype vardır). Önce sütuna göre seçerseniz, bir görünüm döndürülebilir (bu bir kopyayı döndürmekten daha hızlıdır) ve orijinal dtype korunur. Buna karşılık, ilk satırda tarafından seçin ve eğer DataFrame farklı dtypes sütunlar varsa, o zaman Pandalar kopyalar nesne d_type yeni Serisi içine verileri. Bu nedenle sütunları seçmek satırları seçmekle biraz daha hızlıdır. Böylece, her ne kadar df_test.iloc[0]['Btime']
çalışıyor olsa da
, df_test['Btime'].iloc[0]
biraz daha verimlidir.
Görevlendirme söz konusu olduğunda ikisi arasında büyük bir fark vardır.
df_test['Btime'].iloc[0] = x
etkiler df_test
, ancak df_test.iloc[0]['Btime']
olmayabilir. Nedeninin açıklaması için aşağıya bakın. İndeksleme sırasındaki küçük bir fark davranışta büyük bir fark yarattığından, tek indeksleme ataması kullanmak daha iyidir:
df.iloc[0, df.columns.get_loc('Btime')] = x
df.iloc[0, df.columns.get_loc('Btime')] = x
(önerilen):
Önerilen yöntem , bir DataFrame atamak yeni değerlere için zincirli indeksleme önlemek , ve bunun yerine bir yöntem kullanınız Andrew ile gösterilen ,
df.loc[df.index[n], 'Btime'] = x
veya
df.iloc[n, df.columns.get_loc('Btime')] = x
İkinci yöntem biraz daha hızlıdır, çünkü df.loc
satır ve sütun etiketlerini konum dizinlerine dönüştürmek zorundadır, df.iloc
bunun yerine kullanırsanız daha az dönüşüm gerekir
.
df['Btime'].iloc[0] = x
çalışır, ancak önerilmez:
Bu işe yarıyor olsa da, şu anda DataFrames uygulamasından yararlanıyor. Gelecekte Pandaların bu şekilde çalışması gerektiğine dair bir garanti yoktur. Özellikle, (şu anda) df['Btime']
her zaman bir görünüm (kopya değil ) döndürmesi avantajından yararlanarak , sütununun n'inci konumuna yeni bir değer atamakdf['Btime'].iloc[n] = x
için kullanılabilir .Btime
df
Pandalar, dizinleyicilerin bir kopyaya göre bir görünümü ne zaman döndürdüğü konusunda açık bir garanti vermediğinden, zincirleme dizinlemeyi kullanan atamalar genellikle SettingWithCopyWarning
bu durumda atamayı değiştirmeyi başarsa bile her zaman yükselir 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
çalışmıyor:
Buna karşılık, bir kopya döndürdüğü için ile atama df.iloc[0]['bar'] = 123
çalışmıyor 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
Uyarı : Daha önce önermiştim df_test.ix[i, 'Btime']
. Ancak, konuma göre dizine eklemeye çalışmadan önce etikete göre dizine eklemeye çalıştığından bu ith
değerin size verilmesi garanti edilmez . Bu nedenle, DataFrame 0'dan başlayarak sıralanmış sırada olmayan bir tamsayı dizinine sahipse, kullanmak satır yerine etiketli satırı döndürür . Örneğin,ix
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)
işe yaramasını istiyorsanız, daha genel formiloc
unutbu tarafından cevap olarak kullanmaktır