팬더-주어진 열의 첫 번째 행 값 가져 오기


300

이것은 엄청나게 쉬운 질문처럼 보이지만 ... 나는 기대했던 쉬운 대답을 보지 못했습니다.

그렇다면 Pandas에서 주어진 열의 n 번째 행에서 값을 얻는 방법은 무엇입니까? (특히 첫 번째 행에 관심이 있지만 더 일반적인 관행에도 관심이 있습니다).

예를 들어 Btime에서 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)있을 것입니다.보다 일반적인 형태는 ilocunutbu의 답변에 따라 사용 하는 것입니다.
EdChum

1
당신은 단지 가치를 원하십니까 1.2? 또는 길이가 1 인 시리즈 df_test.head(1), 인덱스도 포함합니까? 값을 얻으려면 do df_test.head(1).item()또는 tolist()슬라이스하십시오.
smci

답변:


472

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열 에서 i 번째 값을 선택하려면 다음을 사용할 수 있습니다.

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 (권장) :

DataFrame에 새 값을 할당 하는 권장 방법체인 인덱싱피하고 대신 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가 현재 구현 되는 방식을 활용 하고 있습니다. Pandas가 앞으로 이런 식으로 작동해야한다는 보장은 없습니다. 특히 (현재) df['Btime']항상 (사본이 아닌)보기를 반환하므로 의 열의 n 번째 위치에 새 값 df['Btime'].iloc[n] = x할당 하는 데 사용할 수 있다는 사실을 이용합니다 .Btimedf

Pandas는 인덱서가 뷰와 복사본을 반환하는 시점에 대해 명시 적으로 보장하지 않기 때문에 체인 인덱싱을 사용하는 할당은 일반적으로 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값 을 제공 할 수 없습니다 . 따라서 DataFrame에 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
@CristianCiupitu : DataFrames는 데이터를 열 기반 블록 (각 블록에 단일 dtype이있는 경우)에 저장합니다. 먼저 열별로 선택하면 뷰를 반환 할 수 있으며 (복사본을 반환하는 것보다 빠름) 원본 dtype이 유지됩니다. 반면에, 당신은 첫 번째 행으로 선택한 경우 DataFrame 다른 dtypes의 열이있는 경우, 다음 팬더의 사본 오브젝트 DTYPE의 새로운 시리즈로 데이터입니다. 따라서 열을 선택하는 것이 행을 선택하는 것보다 약간 빠릅니다. 따라서 df_test.iloc[0]['Btime']작동 하지만 df_test.iloc['Btime'][0]조금 더 효율적입니다.
unutbu

@unutbu는 ? df['Btime'].iloc[0]보다 선호됩니다 df['Btime'].values[0]. 설명서 에서 "경고 : 기본 데이터 또는 NumPy 배열에 대한 참조가 필요한지 여부에 따라 Series.array 또는 Series.to_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

당신이 먼저 선택하려는 경우 일반적인 방법으로, N 행 로부터 J 열 에서 pandas dataframe이 작업을 수행하는 가장 좋은 방법입니다 :

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

2
@anis :이 목적을 위해서, 당신은 더 일반적인 해결책을 요구하고 스스로 대답하는 새로운 질문을 더 잘 작성했을 것입니다.
jonathan.scholbach

3

예를 들어 열 'test'와 행 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.