Pandalar - Belirli bir sütunun ilk satır değerini al


301

Bu gülünç kolay bir soru gibi görünüyor ... ama beklediğim kolay cevabı görmüyorum.

Peki, değeri Pandalar'da belirli bir sütunun n. Satırında nasıl alabilirim? (Özellikle ilk sıraya ilgi duyuyorum, ancak daha genel bir uygulamaya da ilgi duyacağım).

Örneğin, değişken olarak Btime'ta 1.2 değerini çekmek istediğimi varsayalım.

Bunu yapmanın doğru yolu nedir?

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
Sadece ilk sıranın df_test.head(1)işe yaramasını istiyorsanız, daha genel form ilocunutbu tarafından cevap olarak kullanmaktır
EdChum

1
Sadece değeri 1.2mi istiyorsun ? veya df_test.head(1)indeks içerecek olan 1 uzunluğundaki Seri ? Sadece değeri almak için df_test.head(1).item(), veya tolist()sonra dilim.
smci

Yanıtlar:


473

ithSatı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

BtimeKullanabileceğ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] = xetkiler 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.locsatır ve sütun etiketlerini konum dizinlerine dönüştürmek zorundadır, df.ilocbunun 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 .Btimedf

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 SettingWithCopyWarningbu 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 ithdeğ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,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
@CristianCiupitu: DataFrames, verileri sütun tabanlı bloklarda (her bloğun tek bir dtypei olduğu yerde) saklar. 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çmekten biraz daha hızlıdır. Böylece, her ne kadar df_test.iloc[0]['Btime']çalışıyor olsa da , df_test.iloc['Btime'][0]biraz daha verimlidir.
unutbu

@unutbu, bir df['Btime'].iloc[0]tercih df['Btime'].values[0]? i görebilirsiniz belgelere diyor o "Uyarı:. Biz temel verilerde veya NumPy diziye bir başvuru ihtiyaç olmadığına bağlı olarak, Series.array veya Series.to_numpy () kullanılmasını öneriyoruz" ama tam olarak ne anlama geldiğinden emin değilim
aydow

28

Değeri yeni bir şeye ayarlamak istediğinize kadar @unutbu tarafından verilen yanıtın doğru olacağını unutmayın, veri çerçeveniz bir görünümse işe yaramaz.

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)

Hem ayar hem de alma ile tutarlı olarak çalışacak başka bir yaklaşım:

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
Ben .csv dosyaları bir grup döngü ve her biri belirli bir sütunun ilk değerini okuyorum. Değeri döndürmek yerine açıklayamadığım bazı nedenlerden dolayı, bu bazen işleme karışan değeri ile birlikte dizini döndürür. Df.col.unique () [0] 'a başvurdum.
serçe

15

Bunu yapmanın başka bir yolu:

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

Bu şekilde kullanmaktan daha hızlı görünüyor .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) - Yalnızca ilk satırın tamamından ilk veri kümesi.
  2. df.iloc[0] - Sütundaki ilk satırın tamamı.

8

İlk pick up istiyorsanız genel bir şekilde, N satır dan J sütununda gelen pandas dataframebunu yapmanın en iyi yolu olduğunu:

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

2
@ anis: Bu amaçla, daha genel bir çözüm isteyen ve kendi başına cevaplayan yeni bir soru yazmanız daha iyi olur.
jonathan.scholbach

3

Örneğin, 'test' ve satır 1 sütunundaki değeri elde etmek için

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

sadece df[['test']].values[0]bir diziyi geri verir


1

İlk satırı almanın ve dizini korumanın başka bir yolu:

x = df.first('d') # Returns the first day. '3d' gives first three days.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.