微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

比较数据帧中的列并将其放入另一个

如何解决比较数据帧中的列并将其放入另一个

我有两个这样的数据框:

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

编辑2: 这是在您的答案中添加额外行后出现的错误

df[list(set(d.values()).difference(df.columns))] = np.nan

My dataframe

Error I'm getting

解决方法

如果需要,请修改时间段:

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。