我有以下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
我需要合并列SIBT
和SOBT
,PLANNED_ARR_HOUR
和PLANNED_DEP_HOUR
,ARRIVAL_FLIGHT_HAUL
和DEPARTURE_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)。
SIBT
,PLANNED_ARR_HOUR
和ARRIVAL_FLIGHT_HAUL
是指类型ARR(到达)。
SOBT
,PLANNED_DEP_HOUR
和DEPARTURE_FLIGHT_HAUL
指的是DEP类型(出发)。
我该怎么办?
答案 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
列,由assign
和concat
用sort_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