如何根据规则将数据帧的每一行拆分为两行?

2024-09-27 19:20:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下数据帧(水平向右漫游以查看所有列):

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,以获得如下新数据帧:

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(离开)。

我该怎么做?你知道吗


Tags: 数据plannedlongflightshortarrdeparturehour
3条回答

首先通过zip创建的字典添加rename列,通过^{}^{}添加新列,并使用^{}添加^{},为了避免重复索引,请使用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

最简单的方法是一分为二,然后浓缩:

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

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

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

现在您有了2个具有相关列的数据帧,请将bothdataframes的列名更改为所需的输出。你知道吗

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])

相关问题 更多 >

    热门问题