J'ai un DataFrame dans Pandas qui ressemble à ceci:
Activity Name Activity Start Activity End
0 Phone 04:00 08:00
Lunch 08:00 08:30
Coffee 08:30 08:45
Phone 08:45 10:30
WrittenSupport 10:30 12:30
1 Phone 04:00 08:00
Lunch 08:00 08:30
Coffee 08:30 08:45
Phone 08:45 09:00
Phone 06:00 09:00
Les données dans mon DataFrame décrivent différentes activités assignées à un agent pendant le quart de travail. Le problème est qu'un autre DataFrame avec des agents n'a que 57 noms alors qu'il y a généralement 4-5 activités assignées à une personne. Lorsque je fusionne mes DataFrames, je me retrouve avec 57 agents et 265 activités qui ne correspondent évidemment pas aux personnes désignées.
Ce qui peut être utile: chaque personne travaille 8 heures.
Comment puis-je le transformer en ceci:
Activity Name Activity Start Activity End 0 Phone 04:00 08:00 1 Lunch 08:00 08:30 2 Coffee 08:30 08:45 3 Phone 08:45 10:30 4 WrittenSupport 10:30 12:30 5 Phone 04:00 08:00 6 Lunch 08:00 08:30 7 Coffee 08:30 08:45 8 Phone 08:45 09:00 9 Phone 06:00 09:00
p >
3 Réponses :
Si vous avez des lignes séparées pour vos agents et vos activités, vous pouvez créer un multi-index comme celui-ci:
activity time
0 Phone 04:00
1 Phone 08:30
2 Coffee 10:30
3 Lunch 04:00
4 Phone 10:30
5 Phone 04:00
6 Lunch 08:30
7 Lunch 10:30
----
activity time
0 Phone 08:45
1 Pooping 08:50
2 Coffee 10:30
3 Lunch 04:00
4 Phone 10:30
5 Meeting 04:00
6 Lunch 08:30
7 Lunch 10:30
----
activity time agent
0 Phone 04:00 Agent_1
1 Phone 08:30 Agent_1
2 Coffee 10:30 Agent_1
3 Lunch 04:00 Agent_1
4 Phone 10:30 Agent_1
5 Phone 04:00 Agent_1
6 Lunch 08:30 Agent_1
7 Lunch 10:30 Agent_1
----
activity time agent
0 Phone 08:45 Agent_2
1 Pooping 08:50 Agent_2
2 Coffee 10:30 Agent_2
3 Lunch 04:00 Agent_2
4 Phone 10:30 Agent_2
5 Meeting 04:00 Agent_2
6 Lunch 08:30 Agent_2
7 Lunch 10:30 Agent_2
----
activity time agent
0 Phone 04:00 Agent_1
1 Phone 08:30 Agent_1
2 Coffee 10:30 Agent_1
3 Lunch 04:00 Agent_1
4 Phone 10:30 Agent_1
5 Phone 04:00 Agent_1
6 Lunch 08:30 Agent_1
7 Lunch 10:30 Agent_1
0 Phone 08:45 Agent_2
1 Pooping 08:50 Agent_2
2 Coffee 10:30 Agent_2
3 Lunch 04:00 Agent_2
4 Phone 10:30 Agent_2
5 Meeting 04:00 Agent_2
6 Lunch 08:30 Agent_2
7 Lunch 10:30 Agent_2
----
time
agent activity
Agent_1 Phone 04:00
Phone 08:30
Coffee 10:30
Lunch 04:00
Phone 10:30
Phone 04:00
Lunch 08:30
Lunch 10:30
Agent_2 Phone 08:45
Pooping 08:50
Coffee 10:30
Lunch 04:00
Phone 10:30
Meeting 04:00
Lunch 08:30
Lunch 10:30
Résultat:
import pandas as pd
# This is the dataframe data with activities you got from a single agent
agent_1 = [['Phone', 'Phone', 'Coffee', 'Lunch', 'Phone', 'Phone', 'Lunch', 'Lunch'],
['04:00', '08:30', '10:30', '04:00', '10:30', '04:00', '08:30', '10:30']]
# This is the dataframe data from a second agent
agent_2 = [['Phone', 'Pooping', 'Coffee', 'Lunch', 'Phone', 'Meeting', 'Lunch', 'Lunch'],
['08:45', '08:50', '10:30', '04:00', '10:30', '04:00', '08:30', '10:30']]
# We create the dataframe for agent 1
df1 = pd.DataFrame(agent_1).T
df1.columns = ['activity', 'time']
# We create the dataframe for agent 2
df2 = pd.DataFrame(agent_2).T
df2.columns = ['activity', 'time']
# Now we have to dataframes we can't really put together
print(df1)
print("----")
print(df2)
print("----")
# So we should give each dataframe a column with its agent.
df1['agent'] = "Agent_1"
df2['agent'] = "Agent_2"
# Now each dataframe has data on its agent
print(df1)
print("----")
print(df2)
print("----")
# Let's combine them
overview = pd.concat([df1, df2])
print(overview)
print("----")
# To make it even better, we could make a multi-index so we can index both agents AND activities
overview.set_index(['agent', 'activity'], inplace=True)
print(overview)
p>
Cela doit se faire automatiquement. J'analyse une page HTML et j'obtiens la liste des agents, des noms d'activités et des périodes d'activité.
@anyplane Je ne suis pas sûr du problème. Pouvez-vous expliquer en quoi cette solution est différente de votre objectif?
Peut-être que je ne comprends pas votre solution, mais j'obtiens simplement le nom de chaque agent et de nombreuses activités différentes. Les deux seules choses cohérentes qui peuvent nous aider sont: chaque agent travaille 8 heures, l'heure de début de l'activité s'incrémente puis se réinitialise (par exemple, 04:00, 06:00, 08:00, 12:00, 04:00). La période entre 12 h 00 et 4 h 00 correspond au moment où l'équipe passe à l'agent suivant.
J'ai édité la solution. Je pense que c'est plus clair sur la façon dont cela pourrait fonctionner.
Essayez peut-être de le faire en créant une liste des différents index, comme ceci:
df= DataFrame(your_array, index=index, columns=column)
puis pour définir le df:
times = [int(x[1][:2]) for x in your_array]
previous = 0
index=[1]
next_agent= 2
for time in times:
if time >= previous:
index.append(â´)
else:
index.append(next_agent)
next_agent+=1
previous = time
Tenez compte des données suivantes (ajoutées pour vérification):
df['index_col']=df[~df.duplicated('Activity Name',keep=False)].expanding().count().iloc[:,1]
df_new=df.set_index(df.index_col.ffill().fillna(0)).rename_axis(None).drop('index_col',1)
print(df_new)
Activity Name Activity Start Activity End
0.0 Phone 04:00:00 08:00:00
0.0 Lunch 08:00:00 08:30:00
0.0 Coffee 08:30:00 08:45:00
0.0 Phone 08:45:00 10:30:00
1.0 WrittenSupport 10:30:00 12:30:00
1.0 Phone 04:00:00 08:00:00
1.0 Lunch 08:00:00 08:30:00
1.0 Coffee 08:30:00 08:45:00
1.0 Phone 08:45:00 09:00:00
1.0 Phone 06:00:00 09:00:00
2.0 Someother Name 10:30:00 12:30:00
2.0 Phone 04:00:00 08:00:00
2.0 Lunch 08:00:00 08:30:00
2.0 Coffee 08:30:00 08:45:00
2.0 Phone 08:45:00 09:00:00
2.0 Phone 06:00:00 09:00:00
Utilisation de ce qui suit:
print(df)
Activity Name Activity Start Activity End
0 Phone 04:00:00 08:00:00
1 Lunch 08:00:00 08:30:00
2 Coffee 08:30:00 08:45:00
3 Phone 08:45:00 10:30:00
4 WrittenSupport 10:30:00 12:30:00
5 Phone 04:00:00 08:00:00
6 Lunch 08:00:00 08:30:00
7 Coffee 08:30:00 08:45:00
8 Phone 08:45:00 09:00:00
9 Phone 06:00:00 09:00:00
10 Someother Name 10:30:00 12:30:00
11 Phone 04:00:00 08:00:00
12 Lunch 08:00:00 08:30:00
13 Coffee 08:30:00 08:45:00
14 Phone 08:45:00 09:00:00
15 Phone 06:00:00 09:00:00
Les numéros de votre exemple sont-ils les identifiants des agents?
@NoSplitSherlock Non, ce sont des indices de ligne. Mais cela pourrait aussi bien être des noms d'agents. L'idée est d'avoir un agent et 4-5 activités clairement assignées dans le DataFrame.
Y a-t-il des informations supplémentaires indiquant la date du quart de travail? Il est problématique de différencier deux équipes qui se sont déroulées à des jours différents, mais à la même heure
@OhadChaet L'ensemble du DataFrame ne couvre qu'une seule journée.