问题描述
我有两个这样的数据框:
df1:
col1 col2 time
0 A A_1 05:02:03
1 A A_2 15:36:14
2 A A_1 28:21:47
3 A A_1 47:21:17
4 A A_1 52:28:01
5 A A_2 72:27:14
我想比较“时间”列中的时间是否为 24 but 48 but 72 并将这些结果放入另一个数据框,如下所示:
df2:
col1 col2 time <24 24<time<48 48<time<72 time>72
0 A A_1 1 2 1 NaN
1 A A_2 1 NaN NaN 1
所以,基本上我想要在这个 df2 中得到满足比较的文件数,例如“时间”列中有两个文件属于 A 和 A_1,时间为
编辑:
谢谢@Andreas 和@Nk03,当我在那里有所有场景时它工作得很好,但是例如当我没有时间 >72 时它失败了,因为 'time3':'time>72'
它没有被创建,我得到一个错误提示:
AttributeError: 'DataFrame' object has no attribute 'str'
我该如何解决这个问题?当我有一个数据框并且它没有任何大于 72 的值或任何不符合其他比较的值时。假设我有一个这样的数据框。
df1:
col1 col2 time
0 A A_1 05:02:03
1 A A_2 15:36:14
2 A A_1 28:21:47
3 A A_1 47:21:17
4 A A_1 32:28:01
5 A A_2 37:27:14
仍然有这个 df2 理想的输出:
col1 col2 time <24 24<time<48 48<time<72 time>72
0 A A_1 1 3 NaN NaN
1 A A_2 1 1 NaN NaN
df[list(set(d.values()).difference(df.columns))] = np.nan
解决方法
如果需要,请修改时间段:
df['time2'] = pd.cut(df.time.str.split(':').str[0].astype(int),bins=[-np.inf,24,48,72,np.inf],include_lowest=True,labels=['time <24','24<time<48','48<time<72','time>72'],right=False)
result = df.pivot_table(index=['col1','col2'],columns='time2',aggfunc='count').reset_index()
,
您可以将时间除以 :,然后将小时除以 24 并四舍五入。之后,您可以旋转整个数据框。之后,以您想要的方式重命名列。
df['day'] = (df['time'].str.split(':').str[0].astype(int)/24).astype(int)
df = df.pivot_table(index=['col1',columns=['day'],values=['time'],aggfunc='count').reset_index()
d = {'time0':'time <24','time1':'24<time<48','time2':'48<time<72','time3':'time>72'}
df.columns = [d.get(''.join(map(str,x)),''.join(map(str,x))) for x in df.columns]
# col1 col2 time <24 24<time<48 48<time<72 time>72
# 0 A A_1 1.0 2.0 1.0 NaN
# 1 A A_2 1.0 NaN NaN 1.0
如果您想在事后进行安全检查以查看是否所有列都在其中,您可以将其用作最后一行:
for col in d.values():
if col not in df.columns:
df[col] = np.nan