이것은 엄청나게 쉬운 질문처럼 보이지만 … 나는 기대했던 쉬운 대답을 보지 못했습니다.
그렇다면 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
답변
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
을 할당 하는 데 사용할 수 있다는 사실을 이용합니다 .Btime
df
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부터 시작하여 정렬 된 순서가 아닌 정수 인덱스가 있으면를 사용 하면 행 이 아닌 레이블 이 지정된 행이 반환됩니다 . 예를 들어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'
답변
@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
답변
이를 수행하는 다른 방법 :
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)
답변
df.iloc[0].head(1)
-첫 번째 전체 행에서만 첫 번째 데이터 세트.df.iloc[0]
-열의 전체 첫 행.
답변
당신이 먼저 선택하려는 경우 일반적인 방법으로, N 행 로부터 J 열 에서 pandas dataframe
이 작업을 수행하는 가장 좋은 방법입니다 :
data = dataframe[0:N][:,J]
답변
예를 들어 열 ‘test’와 행 1에서 값을 얻으려면 다음과 같이 작동합니다.
df[['test']].values[0][0]
df[['test']].values[0]
배열 만 돌려 주므로
답변
첫 번째 행을 가져오고 인덱스를 유지하는 다른 방법 :
x = df.first('d') # Returns the first day. '3d' gives first three days.