【问题标题】:Compare column from a dataframa and put it in another比较数据框中的列并将其放入另一个
【发布时间】:2021-05-12 16:23:54
【问题描述】:

我有两个这样的数据框:

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 但 48 但 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&gt;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

【问题讨论】:

  • 为什么不添加另一列与时间箱?这可能是一种更有用的格式

标签: python python-3.x pandas dataframe compare


【解决方案1】:

如果需要,请修改time-bin:

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()

【讨论】:

    【解决方案2】:

    您可以将时间除以 :,然后将小时除以 24 并四舍五入。之后,您可以旋转整个数据框。之后以您想要的方式重命名列。

    df['day'] = (df['time'].str.split(':').str[0].astype(int)/24).astype(int)
    df = df.pivot_table(index=['col1', 'col2'], 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
    

    【讨论】:

    • 嘿@Andreas,感谢您的回答。我编辑了问题,你能检查一下吗?
    • @user14073111 嘿,是的。我更新了答案
    • 嘿@Andreas,我的那条多余的行出错了,你能检查一下吗?
    • @user14073111 哦,也许我们有不同的 python 或 pandas 版本?好的试试,我刚刚更新的那个。它更长,但应该更简单。
    • 我刚刚意识到我必须更新我的 jupyter 笔记本,这就是它无法正常工作的原因,现在它可以正常工作了。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-14
    • 2019-02-13
    • 1970-01-01
    • 1970-01-01
    • 2020-03-20
    • 2022-08-10
    • 1970-01-01
    相关资源
    最近更新 更多