J'ai un dataframe comme celui-ci

Datetime               status   time
2020-03-28 22:14:08     start   0
2020-03-29 00:28:50     end     02:13:52
2020-03-29 07:15:10     start   0
2020-03-29 07:48:02     end     00:32:47

Comment puis-je le convertir en suivant

start                    end                    time 
2020-03-28 22:14:08      2020-03-29 00:28:50   02:13:52
2020-03-29 07:15:10      2020-03-29 07:48:02   00:32:47
3
Brock 4 juin 2020 à 10:58

3 réponses

Meilleure réponse

L'idée est de créer une nouvelle série d'assistance avec comparer start avec Series.cumsum, ajouté à MulitIndex par DataFrame.set_index, remodeler par DataFrame.unstack, supprimez la colonne non nécessaire de DataFrame.drop avec tuple, car MultiIndex et last in list comprehension créent de nouveaux noms de colonnes:

df = (df.set_index([df['status'].eq('start').cumsum(), 'status'])
       .unstack()
       .drop(('time','start'), axis=1))

df.columns = [y if x == 'Datetime' else x for x, y in df.columns]
print (df)
                        end                start      time
status                                                    
1       2020-03-29 00:28:50  2020-03-28 22:14:08  02:13:52
2       2020-03-29 07:48:02  2020-03-29 07:15:10  00:32:47

Une autre idée si les paires correspondent toujours start, end est possible de sélectionner les valeurs paires et impaires dans les colonnes en les indexant dans Series.iloc, créez un index par défaut par Series.reset_index et regroupez-les par concat:

s = df['Datetime'].iloc[::2].rename('start').reset_index(drop=True)
e = df['Datetime'].iloc[1::2].rename('end').reset_index(drop=True)
t = df['time'].iloc[1::2].reset_index(drop=True)

df = pd.concat([s, e, t], axis=1)
print (df)
                 start                  end      time
0  2020-03-28 22:14:08  2020-03-29 00:28:50  02:13:52
1  2020-03-29 07:15:10  2020-03-29 07:48:02  00:32:47
1
jezrael 4 juin 2020 à 08:16

Bien que la réponse de @ jezrael soit évidemment géniale, voici une autre façon d'essayer. Il utilise l'indexation.

import pandas as pd
a  = pd.DataFrame({'Datetime': ['2020-03-28 22:14:08', '2020-03-29 00:28:50', '2020-03-29 07:15:10', '2020-03-29 07:48:02'], 'status': ['start', 'end', 'start', 'end'], 'time': ['0', '02:13:52', '0', '00:32:47']})

a.set_index('status',inplace=True)

c = pd.DataFrame(columns=['start','end','time'])
c['start']  = a.loc['start']['Datetime'].values
c['end']  = a.loc['end']['Datetime'].values
c['time'] = a.loc['end']['time'].values
print(c)

Production:

                 start                  end      time
0  2020-03-28 22:14:08  2020-03-29 00:28:50  02:13:52
1  2020-03-29 07:15:10  2020-03-29 07:48:02  00:32:47
1
paradoxlover 4 juin 2020 à 08:30

Voici:

import pandas as pd
from io import StringIO

df = pd.read_csv(StringIO("""
Datetime,status,time
2020-03-28 22:14:08,start,0
2020-03-29 00:28:50,end,02:13:52
2020-03-29 07:15:10,start,0
2020-03-29 07:48:02,end,00:32:47"""))
df['start'] = df['Datetime'].shift()
df = df[df['status'] == 'end'][['start', 'Datetime', 'time']]
df = df.rename(columns={'Datetime': 'end'})
print(df)

Production:

                 start                  end      time
1  2020-03-28 22:14:08  2020-03-29 00:28:50  02:13:52
3  2020-03-29 07:15:10  2020-03-29 07:48:02  00:32:47
1
Balaji Ambresh 4 juin 2020 à 08:35