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에서 사용할 수 있어 편리하다고 생각합니다.