2
votes

Attribuer plusieurs lignes à un index dans Pandas

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 >


4 commentaires

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.


3 Réponses :


2
votes

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>


4 commentaires

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.



1
votes

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


0 commentaires

2
votes

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


0 commentaires