Python dfply
dfply
R의 dplyr과 비슷한 기능을 Python에서도 사용가능 한 함수가 dfply다.
*참고: https://towardsdatascience.com/dplyr-style-data-manipulation-with-pipes-in-python-380dcb137000
https://github.com/allenakinkunle/dplyr-style-data-manipulation-in-python
dfply는 Python 3 버전 이상에서만 작동한다고 합니다
#dfply는 밑에 방법으로 설치합니다
!pip install dfply
Collecting dfply
Downloading dfply-0.3.3-py3-none-any.whl (612 kB)
Requirement already satisfied: pandas in c:\users\lg\anaconda3\lib\site-packages (from dfply) (1.0.1)
Requirement already satisfied: numpy in c:\users\lg\anaconda3\lib\site-packages (from dfply) (1.18.1)
Requirement already satisfied: pytz>=2017.2 in c:\users\lg\anaconda3\lib\site-packages (from pandas->dfply) (2019.3)
Requirement already satisfied: python-dateutil>=2.6.1 in c:\users\lg\anaconda3\lib\site-packages (from pandas->dfply) (2.8.1)
Requirement already satisfied: six>=1.5 in c:\users\lg\anaconda3\lib\site-packages (from python-dateutil>=2.6.1->pandas->dfply) (1.14.0)
Installing collected packages: dfply
Successfully installed dfply-0.3.3
# 필요한 라이브러리를 로드합니다.
import pandas as pd
from dfply import * #*는 모두를 의미합니다
# pandas를 활용하면 url에서 직접 데이터를 가져올 수 있습니다.
url = "https://raw.githubusercontent.com/allenakinkunle/dplyr-style-data-manipulation-in-python/master/nycflights13.csv"
# df라는 변수에 데이터를 담아줍시다.
df = pd.read_csv(url)
# head를 이용해 데이터를 미리보기 합시다
df.head()
year | month | day | dep_time | sched_dep_time | dep_delay | arr_time | sched_arr_time | arr_delay | carrier | flight | tailnum | origin | dest | air_time | distance | hour | minute | time_hour | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 2013 | 1 | 1 | 517.0 | 515 | 2.0 | 830.0 | 819 | 11.0 | UA | 1545 | N14228 | EWR | IAH | 227.0 | 1400 | 5 | 15 | 2013-01-01 05:00:00 |
1 | 2013 | 1 | 1 | 533.0 | 529 | 4.0 | 850.0 | 830 | 20.0 | UA | 1714 | N24211 | LGA | IAH | 227.0 | 1416 | 5 | 29 | 2013-01-01 05:00:00 |
2 | 2013 | 1 | 1 | 542.0 | 540 | 2.0 | 923.0 | 850 | 33.0 | AA | 1141 | N619AA | JFK | MIA | 160.0 | 1089 | 5 | 40 | 2013-01-01 05:00:00 |
3 | 2013 | 1 | 1 | 544.0 | 545 | -1.0 | 1004.0 | 1022 | -18.0 | B6 | 725 | N804JB | JFK | BQN | 183.0 | 1576 | 5 | 45 | 2013-01-01 05:00:00 |
4 | 2013 | 1 | 1 | 554.0 | 600 | -6.0 | 812.0 | 837 | -25.0 | DL | 461 | N668DN | LGA | ATL | 116.0 | 762 | 6 | 0 | 2013-01-01 06:00:00 |
pipe는 dplyr의 가장 강력한 무기라고 생각합니다.
R에서는 %>%로 여러 함수를 연결 가능합니다.
dfply의 경우 »가 파이프 연산자 역활을 합니다.
# drop과 select 모두 dfply에 포함되어 있는 기능입니다.
# select 값은 인수로 전달된 열을 반환하고 drop은 반환하지 않습니다.
(df >>
select(X.origin,X.dest,X.hour))
origin | dest | hour | |
---|---|---|---|
0 | EWR | IAH | 5 |
1 | LGA | IAH | 5 |
2 | JFK | MIA | 5 |
3 | JFK | BQN | 5 |
4 | LGA | ATL | 6 |
... | ... | ... | ... |
336771 | JFK | DCA | 14 |
336772 | LGA | SYR | 22 |
336773 | LGA | BNA | 12 |
336774 | LGA | CLE | 11 |
336775 | LGA | RDU | 8 |
336776 rows × 3 columns
(df >>
drop(X.year,X.month,X.day))
dep_time | sched_dep_time | dep_delay | arr_time | sched_arr_time | arr_delay | carrier | flight | tailnum | origin | dest | air_time | distance | hour | minute | time_hour | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 517.0 | 515 | 2.0 | 830.0 | 819 | 11.0 | UA | 1545 | N14228 | EWR | IAH | 227.0 | 1400 | 5 | 15 | 2013-01-01 05:00:00 |
1 | 533.0 | 529 | 4.0 | 850.0 | 830 | 20.0 | UA | 1714 | N24211 | LGA | IAH | 227.0 | 1416 | 5 | 29 | 2013-01-01 05:00:00 |
2 | 542.0 | 540 | 2.0 | 923.0 | 850 | 33.0 | AA | 1141 | N619AA | JFK | MIA | 160.0 | 1089 | 5 | 40 | 2013-01-01 05:00:00 |
3 | 544.0 | 545 | -1.0 | 1004.0 | 1022 | -18.0 | B6 | 725 | N804JB | JFK | BQN | 183.0 | 1576 | 5 | 45 | 2013-01-01 05:00:00 |
4 | 554.0 | 600 | -6.0 | 812.0 | 837 | -25.0 | DL | 461 | N668DN | LGA | ATL | 116.0 | 762 | 6 | 0 | 2013-01-01 06:00:00 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
336771 | NaN | 1455 | NaN | NaN | 1634 | NaN | 9E | 3393 | NaN | JFK | DCA | NaN | 213 | 14 | 55 | 2013-09-30 14:00:00 |
336772 | NaN | 2200 | NaN | NaN | 2312 | NaN | 9E | 3525 | NaN | LGA | SYR | NaN | 198 | 22 | 0 | 2013-09-30 22:00:00 |
336773 | NaN | 1210 | NaN | NaN | 1330 | NaN | MQ | 3461 | N535MQ | LGA | BNA | NaN | 764 | 12 | 10 | 2013-09-30 12:00:00 |
336774 | NaN | 1159 | NaN | NaN | 1344 | NaN | MQ | 3572 | N511MQ | LGA | CLE | NaN | 419 | 11 | 59 | 2013-09-30 11:00:00 |
336775 | NaN | 840 | NaN | NaN | 1020 | NaN | MQ | 3531 | N839MQ | LGA | RDU | NaN | 431 | 8 | 40 | 2013-09-30 08:00:00 |
336776 rows × 16 columns
# select 문에서도 ~를 사용하면 인수로 전달된 값을 반환하지 않습니다.
(df >>
select(~X.hour,~X.minute))
year | month | day | dep_time | sched_dep_time | dep_delay | arr_time | sched_arr_time | arr_delay | carrier | flight | tailnum | origin | dest | air_time | distance | time_hour | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 2013 | 1 | 1 | 517.0 | 515 | 2.0 | 830.0 | 819 | 11.0 | UA | 1545 | N14228 | EWR | IAH | 227.0 | 1400 | 2013-01-01 05:00:00 |
1 | 2013 | 1 | 1 | 533.0 | 529 | 4.0 | 850.0 | 830 | 20.0 | UA | 1714 | N24211 | LGA | IAH | 227.0 | 1416 | 2013-01-01 05:00:00 |
2 | 2013 | 1 | 1 | 542.0 | 540 | 2.0 | 923.0 | 850 | 33.0 | AA | 1141 | N619AA | JFK | MIA | 160.0 | 1089 | 2013-01-01 05:00:00 |
3 | 2013 | 1 | 1 | 544.0 | 545 | -1.0 | 1004.0 | 1022 | -18.0 | B6 | 725 | N804JB | JFK | BQN | 183.0 | 1576 | 2013-01-01 05:00:00 |
4 | 2013 | 1 | 1 | 554.0 | 600 | -6.0 | 812.0 | 837 | -25.0 | DL | 461 | N668DN | LGA | ATL | 116.0 | 762 | 2013-01-01 06:00:00 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
336771 | 2013 | 9 | 30 | NaN | 1455 | NaN | NaN | 1634 | NaN | 9E | 3393 | NaN | JFK | DCA | NaN | 213 | 2013-09-30 14:00:00 |
336772 | 2013 | 9 | 30 | NaN | 2200 | NaN | NaN | 2312 | NaN | 9E | 3525 | NaN | LGA | SYR | NaN | 198 | 2013-09-30 22:00:00 |
336773 | 2013 | 9 | 30 | NaN | 1210 | NaN | NaN | 1330 | NaN | MQ | 3461 | N535MQ | LGA | BNA | NaN | 764 | 2013-09-30 12:00:00 |
336774 | 2013 | 9 | 30 | NaN | 1159 | NaN | NaN | 1344 | NaN | MQ | 3572 | N511MQ | LGA | CLE | NaN | 419 | 2013-09-30 11:00:00 |
336775 | 2013 | 9 | 30 | NaN | 840 | NaN | NaN | 1020 | NaN | MQ | 3531 | N839MQ | LGA | RDU | NaN | 431 | 2013-09-30 08:00:00 |
336776 rows × 17 columns
# mask()를 통해 결과를 필터링 할 수 있습니다.
(df >>
mask(X.month == 1, X.day == 1, X.origin == 'JFK', X.hour > 10))
year | month | day | dep_time | sched_dep_time | dep_delay | arr_time | sched_arr_time | arr_delay | carrier | flight | tailnum | origin | dest | air_time | distance | hour | minute | time_hour | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
151 | 2013 | 1 | 1 | 848.0 | 1835 | 853.0 | 1001.0 | 1950 | 851.0 | MQ | 3944 | N942MQ | JFK | BWI | 41.0 | 184 | 18 | 35 | 2013-01-01 18:00:00 |
258 | 2013 | 1 | 1 | 1059.0 | 1100 | -1.0 | 1210.0 | 1215 | -5.0 | MQ | 3792 | N509MQ | JFK | DCA | 50.0 | 213 | 11 | 0 | 2013-01-01 11:00:00 |
265 | 2013 | 1 | 1 | 1111.0 | 1115 | -4.0 | 1222.0 | 1226 | -4.0 | B6 | 24 | N279JB | JFK | BTV | 52.0 | 266 | 11 | 15 | 2013-01-01 11:00:00 |
266 | 2013 | 1 | 1 | 1112.0 | 1100 | 12.0 | 1440.0 | 1438 | 2.0 | UA | 285 | N517UA | JFK | SFO | 364.0 | 2586 | 11 | 0 | 2013-01-01 11:00:00 |
272 | 2013 | 1 | 1 | 1124.0 | 1100 | 24.0 | 1435.0 | 1431 | 4.0 | B6 | 641 | N590JB | JFK | SFO | 349.0 | 2586 | 11 | 0 | 2013-01-01 11:00:00 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
832 | 2013 | 1 | 1 | 2326.0 | 2130 | 116.0 | 131.0 | 18 | 73.0 | B6 | 199 | N594JB | JFK | LAS | 290.0 | 2248 | 21 | 30 | 2013-01-01 21:00:00 |
833 | 2013 | 1 | 1 | 2327.0 | 2250 | 37.0 | 32.0 | 2359 | 33.0 | B6 | 22 | N639JB | JFK | SYR | 45.0 | 209 | 22 | 50 | 2013-01-01 22:00:00 |
835 | 2013 | 1 | 1 | 2353.0 | 2359 | -6.0 | 425.0 | 445 | -20.0 | B6 | 739 | N591JB | JFK | PSE | 195.0 | 1617 | 23 | 59 | 2013-01-01 23:00:00 |
836 | 2013 | 1 | 1 | 2353.0 | 2359 | -6.0 | 418.0 | 442 | -24.0 | B6 | 707 | N794JB | JFK | SJU | 185.0 | 1598 | 23 | 59 | 2013-01-01 23:00:00 |
837 | 2013 | 1 | 1 | 2356.0 | 2359 | -3.0 | 425.0 | 437 | -12.0 | B6 | 727 | N588JB | JFK | BQN | 186.0 | 1576 | 23 | 59 | 2013-01-01 23:00:00 |
213 rows × 19 columns
# arrange()를 통해 결과를 정렬 할 수 있습니다.
# 밑의 코드 같은 경우 distance로 먼저 정렬하고 그 다음에 hours로 정렬합니다.
(df >>
arrange(X.distance, X.hour))
year | month | day | dep_time | sched_dep_time | dep_delay | arr_time | sched_arr_time | arr_delay | carrier | flight | tailnum | origin | dest | air_time | distance | hour | minute | time_hour | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
275945 | 2013 | 7 | 27 | NaN | 106 | NaN | NaN | 245 | NaN | US | 1632 | NaN | EWR | LGA | NaN | 17 | 1 | 6 | 2013-07-27 01:00:00 |
3083 | 2013 | 1 | 4 | 1240.0 | 1200 | 40.0 | 1333.0 | 1306 | 27.0 | EV | 4193 | N14972 | EWR | PHL | 30.0 | 80 | 12 | 0 | 2013-01-04 12:00:00 |
3901 | 2013 | 1 | 5 | 1155.0 | 1200 | -5.0 | 1241.0 | 1306 | -25.0 | EV | 4193 | N14902 | EWR | PHL | 29.0 | 80 | 12 | 0 | 2013-01-05 12:00:00 |
3426 | 2013 | 1 | 4 | 1829.0 | 1615 | 134.0 | 1937.0 | 1721 | 136.0 | EV | 4502 | N15983 | EWR | PHL | 28.0 | 80 | 16 | 15 | 2013-01-04 16:00:00 |
10235 | 2013 | 1 | 12 | 1613.0 | 1617 | -4.0 | 1708.0 | 1722 | -14.0 | EV | 4616 | N11150 | EWR | PHL | 36.0 | 80 | 16 | 17 | 2013-01-12 16:00:00 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
331506 | 2013 | 9 | 25 | 1001.0 | 1000 | 1.0 | 1508.0 | 1445 | 23.0 | HA | 51 | N389HA | JFK | HNL | 636.0 | 4983 | 10 | 0 | 2013-09-25 10:00:00 |
333478 | 2013 | 9 | 27 | 951.0 | 1000 | -9.0 | 1442.0 | 1445 | -3.0 | HA | 51 | N390HA | JFK | HNL | 629.0 | 4983 | 10 | 0 | 2013-09-27 10:00:00 |
334406 | 2013 | 9 | 28 | 955.0 | 1000 | -5.0 | 1412.0 | 1445 | -33.0 | HA | 51 | N391HA | JFK | HNL | 584.0 | 4983 | 10 | 0 | 2013-09-28 10:00:00 |
335095 | 2013 | 9 | 29 | 957.0 | 1000 | -3.0 | 1405.0 | 1445 | -40.0 | HA | 51 | N384HA | JFK | HNL | 580.0 | 4983 | 10 | 0 | 2013-09-29 10:00:00 |
336081 | 2013 | 9 | 30 | 959.0 | 1000 | -1.0 | 1438.0 | 1445 | -7.0 | HA | 51 | N392HA | JFK | HNL | 603.0 | 4983 | 10 | 0 | 2013-09-30 10:00:00 |
336776 rows × 19 columns
# 내림차순으로 보고싶다면 ascending =False를 해주면 됩니다
((df >>
arrange(X.distance,X.hour, ascending=False)))
year | month | day | dep_time | sched_dep_time | dep_delay | arr_time | sched_arr_time | arr_delay | carrier | flight | tailnum | origin | dest | air_time | distance | hour | minute | time_hour | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
28259 | 2013 | 10 | 2 | 951.0 | 1000 | -9.0 | 1438.0 | 1450 | -12.0 | HA | 51 | N381HA | JFK | HNL | 623.0 | 4983 | 10 | 0 | 2013-10-02 10:00:00 |
30229 | 2013 | 10 | 4 | 954.0 | 1000 | -6.0 | 1438.0 | 1450 | -12.0 | HA | 51 | N380HA | JFK | HNL | 618.0 | 4983 | 10 | 0 | 2013-10-04 10:00:00 |
31157 | 2013 | 10 | 5 | 1002.0 | 1000 | 2.0 | 1418.0 | 1450 | -32.0 | HA | 51 | N384HA | JFK | HNL | 593.0 | 4983 | 10 | 0 | 2013-10-05 10:00:00 |
31850 | 2013 | 10 | 6 | 958.0 | 1000 | -2.0 | 1415.0 | 1450 | -35.0 | HA | 51 | N389HA | JFK | HNL | 601.0 | 4983 | 10 | 0 | 2013-10-06 10:00:00 |
32842 | 2013 | 10 | 7 | 957.0 | 1000 | -3.0 | 1504.0 | 1450 | 14.0 | HA | 51 | N390HA | JFK | HNL | 642.0 | 4983 | 10 | 0 | 2013-10-07 10:00:00 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
112694 | 2013 | 2 | 2 | 1610.0 | 1617 | -7.0 | 1702.0 | 1722 | -20.0 | EV | 4616 | N18120 | EWR | PHL | 33.0 | 80 | 16 | 17 | 2013-02-02 16:00:00 |
118425 | 2013 | 2 | 9 | 1619.0 | 1617 | 2.0 | 1706.0 | 1722 | -16.0 | EV | 4616 | N10575 | EWR | PHL | 25.0 | 80 | 16 | 17 | 2013-02-09 16:00:00 |
3083 | 2013 | 1 | 4 | 1240.0 | 1200 | 40.0 | 1333.0 | 1306 | 27.0 | EV | 4193 | N14972 | EWR | PHL | 30.0 | 80 | 12 | 0 | 2013-01-04 12:00:00 |
3901 | 2013 | 1 | 5 | 1155.0 | 1200 | -5.0 | 1241.0 | 1306 | -25.0 | EV | 4193 | N14902 | EWR | PHL | 29.0 | 80 | 12 | 0 | 2013-01-05 12:00:00 |
275945 | 2013 | 7 | 27 | NaN | 106 | NaN | NaN | 245 | NaN | US | 1632 | NaN | EWR | LGA | NaN | 17 | 1 | 6 | 2013-07-27 01:00:00 |
336776 rows × 19 columns
# group by를 통해 데이터를 컬럼에 따라 묶을 수 있습니다.
# 밑의 경우는 집약함수를 설정을 안했기 때문에 데이터 그대로 반환됩니다.
(df >>
group_by(X.origin))
year | month | day | dep_time | sched_dep_time | dep_delay | arr_time | sched_arr_time | arr_delay | carrier | flight | tailnum | origin | dest | air_time | distance | hour | minute | time_hour | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 2013 | 1 | 1 | 517.0 | 515 | 2.0 | 830.0 | 819 | 11.0 | UA | 1545 | N14228 | EWR | IAH | 227.0 | 1400 | 5 | 15 | 2013-01-01 05:00:00 |
1 | 2013 | 1 | 1 | 533.0 | 529 | 4.0 | 850.0 | 830 | 20.0 | UA | 1714 | N24211 | LGA | IAH | 227.0 | 1416 | 5 | 29 | 2013-01-01 05:00:00 |
2 | 2013 | 1 | 1 | 542.0 | 540 | 2.0 | 923.0 | 850 | 33.0 | AA | 1141 | N619AA | JFK | MIA | 160.0 | 1089 | 5 | 40 | 2013-01-01 05:00:00 |
3 | 2013 | 1 | 1 | 544.0 | 545 | -1.0 | 1004.0 | 1022 | -18.0 | B6 | 725 | N804JB | JFK | BQN | 183.0 | 1576 | 5 | 45 | 2013-01-01 05:00:00 |
4 | 2013 | 1 | 1 | 554.0 | 600 | -6.0 | 812.0 | 837 | -25.0 | DL | 461 | N668DN | LGA | ATL | 116.0 | 762 | 6 | 0 | 2013-01-01 06:00:00 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
336771 | 2013 | 9 | 30 | NaN | 1455 | NaN | NaN | 1634 | NaN | 9E | 3393 | NaN | JFK | DCA | NaN | 213 | 14 | 55 | 2013-09-30 14:00:00 |
336772 | 2013 | 9 | 30 | NaN | 2200 | NaN | NaN | 2312 | NaN | 9E | 3525 | NaN | LGA | SYR | NaN | 198 | 22 | 0 | 2013-09-30 22:00:00 |
336773 | 2013 | 9 | 30 | NaN | 1210 | NaN | NaN | 1330 | NaN | MQ | 3461 | N535MQ | LGA | BNA | NaN | 764 | 12 | 10 | 2013-09-30 12:00:00 |
336774 | 2013 | 9 | 30 | NaN | 1159 | NaN | NaN | 1344 | NaN | MQ | 3572 | N511MQ | LGA | CLE | NaN | 419 | 11 | 59 | 2013-09-30 11:00:00 |
336775 | 2013 | 9 | 30 | NaN | 840 | NaN | NaN | 1020 | NaN | MQ | 3531 | N839MQ | LGA | RDU | NaN | 431 | 8 | 40 | 2013-09-30 08:00:00 |
336776 rows × 19 columns
#mean값으로 묶으면 origin이 group화 되서 반환됩니다.
(df >>
group_by(X.origin) >>
summarize(mean_distance = X.distance.mean()))
origin | mean_distance | |
---|---|---|
0 | EWR | 1056.742790 |
1 | JFK | 1266.249077 |
2 | LGA | 779.835671 |
# dfply를 사용하면 다음 단계를 위해 변수를 저장할 필요가 없습니다.
(df >>
mask(X.hour >10) >>
mutate(speed = X.distance / (X.air_time * 60)) >>
group_by(X.origin) >>
summarize(mean_speed = X.speed.mean()) >>
arrange(X.mean_speed, ascending=False))
origin | mean_speed | |
---|---|---|
0 | EWR | 0.109777 |
1 | JFK | 0.109427 |
2 | LGA | 0.107362 |
# 위의 결과를 재사용을 위해 변수에 담을 수도 있습니다.
df2 = (df >>
mask(X.hour >10) >>
mutate(speed = X.distance / (X.air_time * 60)) >>
group_by(X.origin) >>
summarize(mean_speed = X.speed.mean()) >>
arrange(X.mean_speed, ascending=False))
df2
origin | mean_speed | |
---|---|---|
0 | EWR | 0.109777 |
1 | JFK | 0.109427 |
2 | LGA | 0.107362 |
# dfply를 사용하지 않는 다면 밑의 코드처럼 작성할 수 있습니다.
# 이 경우 새로운 변수를 지정해 줘야 합니다.
df.loc[df['hour'] > 10, 'speed'] = df['distance'] / (df['air_time'] * 60)
result = df.groupby('origin', as_index = False)['speed'].mean()
result.sort_values('speed', ascending = False)
origin | speed | |
---|---|---|
0 | EWR | 0.109777 |
1 | JFK | 0.109427 |
2 | LGA | 0.107362 |
개인적으로 R의 강력한 기능이였던 dplyr을 Python에서 사용할 수 있어 편리하다고 생각합니다.