如何根据规则将DataFrame的每一行分为2行?

时间:2019-02-24 08:57:29

标签: python pandas

我有以下pandas DataFrame(向右水平滚动以查看所有列):

SIBT                SOBT                PLANNED_ARR_HOUR    PLANNED_DEP_HOUR    ARRIVAL_FLIGHT_HAUL  DEPARTURE_FLIGHT_HAUL
2016-01-01 04:05:00 2016-01-01 14:10:00 4                   14                  Ultra Long Haul      Long Haul
2016-01-01 04:25:00 2016-01-01 06:30:00 4                   6                   Ultra Long Haul      Short Haul
2016-01-01 05:05:00 2016-01-01 07:05:00 5                   7                   Long Haul            Long Haul
2016-01-01 05:20:00 2016-01-01 10:40:00 5                   10                  Short Haul           Long Haul
2016-01-01 05:25:00 2016-01-01 10:50:00 5                   10                  Long Haul            Long Haul

我需要合并列SIBTSOBTPLANNED_ARR_HOURPLANNED_DEP_HOURARRIVAL_FLIGHT_HAULDEPARTURE_FLIGHT_HAUL以获得新的DataFrame如下:

DATETIME             PLANNER_HOUR     FLIGHT_HAUL       TYPE
2016-01-01 04:05:00  4                Ultra Long Haul   ARR
2016-01-01 14:10:00  14               Long Haul         DEP
2016-01-01 04:25:00  4                Ultra Long Haul   ARR
2016-01-01 06:30:00  6                Short Haul        DEP
...

基本上,每行应分为两行,以获取到达(ARR)和离开(DEP)。

  • SIBTPLANNED_ARR_HOURARRIVAL_FLIGHT_HAUL是指类型ARR(到达)。

  • SOBTPLANNED_DEP_HOURDEPARTURE_FLIGHT_HAUL指的是DEP类型(出发)。

我该怎么办?

3 个答案:

答案 0 :(得分:4)

最简单的方法是将其拆分为两个,然后合并:

dep_cols = ['SOBT', 'PLANNED_DEP_HOUR', 'DEPARTURE_FLIGHT_HAUL']
arr_cols = ['SIBT', 'PLANNED_ARR_HOUR', 'ARRIVAL_FLIGHT_HAUL']
new_cols = ['DATETIME','PLANNER_HOUR','FLIGHT_HAUL']

dep = df[dep_cols].copy()
arr = df[arr_cols].copy()

dep.columns, arr.columns = new_cols, new_cols

dep['TYPE'] = 'DEP'
arr['TYPE'] = 'ARR'

pd.concat([dep, arr])

    DATETIME    PLANNER_HOUR    FLIGHT_HAUL     TYPE
0   2016-01-01 14:10:00     14  Long Haul       DEP
1   2016-01-01 06:30:00     6   Short Haul      DEP
2   2016-01-01 07:05:00     7   Long Haul       DEP
3   2016-01-01 10:40:00     10  Long Haul       DEP
4   2016-01-01 10:50:00     10  Long Haul       DEP
0   2016-01-01 04:05:00     4   Ultra Long Haul ARR
1   2016-01-01 04:25:00     4   Ultra Long Haul ARR
2   2016-01-01 05:05:00     5   Long Haul       ARR
3   2016-01-01 05:20:00     5   Short Haul      ARR
4   2016-01-01 05:25:00     5   Long Haul       ARR

答案 1 :(得分:3)

我认为最简单的方法是按列提取原始表格的到达和离开,重命名各列并重新组合。例如

arrive = data[ ['SIBT', 'PLANNED_ARR_HOUR', 'ARRIVAL_FLIGHT_HAUL'] ]
depart = data[ ['SOBT', 'PLANNED_DEP_HOUR', 'DEPARTURE_FLIGHT_HAUL'] ]

您现在有2个带有相关列的数据框,将两个数据框的列名更改为所需的输出。

arrive.columns = ['DATETIME', 'PLANNER_HOUR', 'FLIGHT_HAUL']
depart.columns = ['DATETIME', 'PLANNER_HOUR', 'FLIGHT_HAUL']

添加您的类型列。

arrive['TYPE'] = 'ARR'
depart['TYPE'] = 'DEP'

现在它们具有相同的列名,可以正常进行串联了。

result = pd.concat([arrive, depart])

答案 2 :(得分:0)

rename创建的字典的前zip列,由assignconcatsort_index添加新列,为避免重复索引添加{{3 }}与drop=True

c1 = ['SIBT', 'PLANNED_ARR_HOUR', 'ARRIVAL_FLIGHT_HAUL']
c2 = ['SOBT', 'PLANNED_DEP_HOUR', 'DEPARTURE_FLIGHT_HAUL']
c3 = ['DATETIME','PLANNER_HOUR','FLIGHT_HAUL']

df1 = df.rename(columns=dict(zip(c1, c3)))[c3].assign(TYPE='ARR')
df2 = df.rename(columns=dict(zip(c2, c3)))[c3].assign(TYPE='DEP')
df = pd.concat([df1, df2]).sort_index().reset_index(drop=True)
print (df)
              DATETIME  PLANNER_HOUR      FLIGHT_HAUL TYPE
0  2016-01-01 04:05:00             4  Ultra Long Haul  ARR
1  2016-01-01 14:10:00            14        Long Haul  DEP
2  2016-01-01 04:25:00             4  Ultra Long Haul  ARR
3  2016-01-01 06:30:00             6       Short Haul  DEP
4  2016-01-01 05:05:00             5        Long Haul  ARR
5  2016-01-01 07:05:00             7        Long Haul  DEP
6  2016-01-01 05:20:00             5       Short Haul  ARR
7  2016-01-01 10:40:00            10        Long Haul  DEP
8  2016-01-01 05:25:00             5        Long Haul  ARR
9  2016-01-01 10:50:00            10        Long Haul  DEP

使用lreshape的另一种解决方案:

df = df.assign(TYPE1='ARR', TYPE2='DEP')
d = {'DATETIME':['SIBT','SOBT'],
     'PLANNER_HOUR':['PLANNED_ARR_HOUR','PLANNED_DEP_HOUR'],
     'FLIGHT_HAUL':['ARRIVAL_FLIGHT_HAUL','DEPARTURE_FLIGHT_HAUL'],
     'TYPE':['TYPE1','TYPE2']}
df = pd.lreshape(df, d)
print (df)
              DATETIME  PLANNER_HOUR      FLIGHT_HAUL TYPE
0  2016-01-01 04:05:00             4  Ultra Long Haul  ARR
1  2016-01-01 04:25:00             4  Ultra Long Haul  ARR
2  2016-01-01 05:05:00             5        Long Haul  ARR
3  2016-01-01 05:20:00             5       Short Haul  ARR
4  2016-01-01 05:25:00             5        Long Haul  ARR
5  2016-01-01 14:10:00            14        Long Haul  DEP
6  2016-01-01 06:30:00             6       Short Haul  DEP
7  2016-01-01 07:05:00             7        Long Haul  DEP
8  2016-01-01 10:40:00            10        Long Haul  DEP
9  2016-01-01 10:50:00            10        Long Haul  DEP