我在Pandas中有一个DataFrame,看起来像这样:
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
我的DataFrame中的数据描述了在轮班期间分配给业务代表的不同活动。问题在于,另一个带有代理的DataFrame仅具有57个名称,而通常将4-5个活动分配给一个人。合并DataFrame时,我得到的57个代理和265个活动显然与指定人员不匹配。
什么是有帮助的:每个人工作8个小时。
如何将其转换为如下形式:
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
答案 0 :(得分:2)
考虑以下数据(添加了一些数据进行验证):
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
使用以下内容:
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
答案 1 :(得分:1)
如果您的代理和活动有单独的行,则可以创建如下所示的多索引:
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)
输出:
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
答案 2 :(得分:1)
也许尝试通过创建不同索引的列表来做到这一点,例如:
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
然后设置df:
df= DataFrame(your_array, index=index, columns=column)