>백엔드 개발 >파이썬 튜토리얼 >Pandas의 데이터프레임 쿼리 방법은 무엇입니까?

Pandas의 데이터프레임 쿼리 방법은 무엇입니까?

php中世界最好的语言
php中世界最好的语言원래의
2018-04-12 09:56:204757검색

이번에는 pandas에서 Dataframe을 쿼리하는 방법과 pandas에서 Dataframe을 쿼리할 때 주의사항에 대해 알려드리겠습니다. 다음은 실제 사례입니다.

pandas는 다양한 슬라이싱 방법을 제공하는데, 이러한 방법에 대해 잘 모르면 혼동하기 쉬운 경우가 많습니다. 다음 예에서는 이러한 슬라이싱 방법을 보여줍니다.

데이터 소개

먼저 무작위로 데이터 세트 생성:

In [5]: rnd_1 = [random.randrange(1,20) for x in xrange(1000)]
  ...: rnd_2 = [random.randrange(1,20) for x in xrange(1000)]
  ...: rnd_3 = [random.randrange(1,20) for x in xrange(1000)]
  ...: fecha = pd.date_range('2012-4-10', '2015-1-4')
  ...: 
  ...: data = pd.DataFrame({'fecha':fecha, 'rnd_1': rnd_1, 'rnd_2': rnd_2, 'rnd_3': rnd_3})
In [6]: data.describe()
Out[6]: 
       rnd_1    rnd_2    rnd_3
count 1000.000000 1000.000000 1000.000000
mean   9.946000   9.825000   9.894000
std    5.553911   5.559432   5.423484
min    1.000000   1.000000   1.000000
25%    5.000000   5.000000   5.000000
50%   10.000000  10.000000  10.000000
75%   15.000000  15.000000  14.000000
max   19.000000  19.000000  19.000000

[] 슬라이싱 방법

대괄호를 사용하면 DataFrame을 슬라이싱할 수 있으며 이는 python과 다소 유사합니다. ' 목록 슬라이싱 . 인덱스에 따라 행 선택, 열 선택, 블록 선택이 가능합니다.

# 行选择
In [7]: data[1:5]
Out[7]: 
    fecha rnd_1 rnd_2 rnd_3
1 2012-04-11   1   16   3
2 2012-04-12   7   6   1
3 2012-04-13   2   16   7
4 2012-04-14   4   17   7
# 列选择
In [10]: data[['rnd_1', 'rnd_3']]
Out[10]: 
   rnd_1 rnd_3
0    8   12
1    1   3
2    7   1
3    2   7
4    4   7
5    12   8
6    2   12
7    9   8
8    13   17
9    4   7
10   14   14
11   19   16
12    2   12
13   15   18
14   13   18
15   13   11
16   17   7
17   14   10
18    9   6
19   11   15
20   16   13
21   18   9
22    1   18
23    4   3
24    6   11
25    2   13
26    7   17
27   11   8
28    3   12
29    4   2
..   ...  ...
970   8   14
971   19   5
972   13   2
973   8   10
974   8   17
975   6   16
976   3   2
977   12   6
978   12   10
979   15   13
980   8   4
981   17   3
982   1   17
983   11   5
984   7   7
985   13   14
986   6   19
987   13   9
988   3   15
989   19   6
990   7   11
991   11   7
992   19   12
993   2   15
994   10   4
995   14   13
996   12   11
997   11   15
998   17   14
999   3   8
[1000 rows x 2 columns]
# 区块选择
In [11]: data[:7][['rnd_1', 'rnd_2']]
Out[11]: 
  rnd_1 rnd_2
0   8   17
1   1   16
2   7   6
3   2   16
4   4   17
5   12   19
6   2   7

단, 다중 열 선택의 경우 행 선택과 같은 1:5 방식을 사용할 수 없습니다.

In [12]: data[['rnd_1':'rnd_3']]
 File "<ipython-input-13-6291b6a83eb0>", line 1
  data[['rnd_1':'rnd_3']]
         ^
SyntaxError: invalid syntax

loc

loc을 사용하면 인덱스에 따라 행과 열을 선택할 수 있습니다.

In [13]: data.loc[1:5]
Out[13]: 
    fecha rnd_1 rnd_2 rnd_3
1 2012-04-11   1   16   3
2 2012-04-12   7   6   1
3 2012-04-13   2   16   7
4 2012-04-14   4   17   7
5 2012-04-15   12   19   8

여기서 loc과 첫 번째 방법의 차이점은 5번째 행도 선택하는 반면 첫 번째 방법은 4번째 행만 선택한다는 점에 유의해야 합니다.

data.loc[2:4, ['rnd_2', 'fecha']]
Out[14]: 
  rnd_2   fecha
2   6 2012-04-12
3   16 2012-04-13
4   17 2012-04-14

loc는 두 특정 날짜 사이의 데이터를 선택할 수 있습니다. 두 날짜 모두 색인에 있어야 합니다.

In [15]: data_fecha = data.set_index('fecha')
  ...: data_fecha.head()
Out[15]: 
      rnd_1 rnd_2 rnd_3
fecha             
2012-04-10   8   17   12
2012-04-11   1   16   3
2012-04-12   7   6   1
2012-04-13   2   16   7
2012-04-14   4   17   7
In [16]: # 生成两个特定日期
  ...: fecha_1 = dt.datetime(2013, 4, 14)
  ...: fecha_2 = dt.datetime(2013, 4, 18)
  ...: 
  ...: # 生成切片数据
  ...: data_fecha.loc[fecha_1: fecha_2]
Out[16]: 
      rnd_1 rnd_2 rnd_3
fecha             
2013-04-14   17   10   5
2013-04-15   14   4   9
2013-04-16   1   2   18
2013-04-17   9   15   1
2013-04-18   16   7   17

Update:특별한 요구 사항이 없다면 loc을 사용하고 []를 가능한 한 적게 사용하는 것이 좋습니다. 왜냐하면 loc은 DataFrame을 재할당할 때 연결된 인덱싱 문제를 방지하고 컴파일러는 []를 사용할 때 매우 느림 SettingWithCopy에 대해 경고가 표시될 수 있습니다.

자세한 내용은 공식 문서를 참조하세요: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy

iloc

If loc 선택할 인덱스(index) 값을 기준으로 하고, iloc은 인덱스의 위치에 따라 선택합니다. iloc은 인덱스의 특정 값에는 관심이 없고 위치에만 관심이 있기 때문에 iloc을 사용할 때는 대괄호 안에 숫자 값만 사용할 수 있습니다.

# 行选择
In [17]: data_fecha[10: 15]
Out[17]: 
      rnd_1 rnd_2 rnd_3
fecha             
2012-04-20   14   6   14
2012-04-21   19   14   16
2012-04-22   2   6   12
2012-04-23   15   8   18
2012-04-24   13   8   18
# 列选择
In [18]: data_fecha.iloc[:,[1,2]].head()
Out[18]: 
      rnd_2 rnd_3
fecha          
2012-04-10   17   12
2012-04-11   16   3
2012-04-12   6   1
2012-04-13   16   7
2012-04-14   17   7
# 切片选择
In [19]: data_fecha.iloc[[1,12,34],[0,2]]
Out[19]: 
      rnd_1 rnd_3
fecha          
2012-04-11   1   3
2012-04-22   2   12
2012-05-14   17   10

at

at은 loc과 유사하지만 loc보다 데이터에 더 빠르게 액세스하고 여러 요소가 아닌 단일 요소에만 액세스할 수 있습니다.

In [20]: timeit data_fecha.at[fecha_1,'rnd_1']
The slowest run took 3783.11 times longer than the fastest. This could mean that an intermediate result is being cached.
100000 loops, best of 3: 11.3 µs per loop
In [21]: timeit data_fecha.loc[fecha_1,'rnd_1']
The slowest run took 121.24 times longer than the fastest. This could mean that an intermediate result is being cached.
10000 loops, best of 3: 192 µs per loop
In [22]: data_fecha.at[fecha_1,'rnd_1']
Out[22]: 17

iat

iat와 iloc의 관계는 at과 loc의 관계와 같습니다. at과 마찬가지로 단일 요소에만 액세스할 수 있습니다.

In [23]: data_fecha.iat[1,0]
Out[23]: 1
In [24]: timeit data_fecha.iat[1,0]
The slowest run took 6.23 times longer than the fastest. This could mean that an intermediate result is being cached.
100000 loops, best of 3: 8.77 µs per loop
In [25]: timeit data_fecha.iloc[1,0]
10000 loops, best of 3: 158 µs per loop

ix

위에서 언급한 방법은 모두 쿼리의 순위가 인덱스에 있거나 위치가 길이 범위를 초과하지 않아야 하는 반면, ix를 사용하면 DataFrame에 없는 데이터를 가져올 수 있습니다. 색인.

In [28]: date_1 = dt.datetime(2013, 1, 10, 8, 30)
  ...: date_2 = dt.datetime(2013, 1, 13, 4, 20)
  ...: 
  ...: # 生成切片数据
  ...: data_fecha.ix[date_1: date_2]
Out[28]: 
      rnd_1 rnd_2 rnd_3
fecha             
2013-01-11   19   17   19
2013-01-12   10   9   17
2013-01-13   15   3   10

위의 예시와 같이 2013년 1월 10일은 8시 30분보다 빠른 0시로 간주되어 선택되지 않았습니다.

이 기사의 사례를 읽은 후 방법을 마스터했다고 생각합니다. 더 흥미로운 정보를 보려면 PHP 중국어 웹사이트의 다른 관련 기사를 주목하세요!

추천 도서:

Python이 Baidu 음성 인식 API를 구현하는 방법에 대한 자세한 설명

Python이 API를 호출하여 스마트 답장 기능을 구현하는 방법

위 내용은 Pandas의 데이터프레임 쿼리 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.