【问题标题】:Python: How to create a new dataframe conditional sum two columns?Python:如何创建一个新的数据框条件和两列?
【发布时间】:2021-02-16 04:44:12
【问题描述】:

我有一个数据框,其中每一行代表用户在一个月内花费在一个独特问题上的时间。我想创建一个新的数据框来按用户 ID 分组,显示每个用户,1)他们打开了多少问题,2)他们花了超过 60 分钟的时间,3)除以 2)除以 1)和将 4 列导出到 Excel。我能够打开每个人打开的所有问题,但无法解决其他问题。

原始数据框:问题 ID、用户 ID、所用时间

用于获取每个用户打开的总问题的代码:df.groupby('User ID')['Issue ID'].nunique()

【问题讨论】:

  • 你能分享一个你的数据框样本吗?
  • 嗨 Bendriss,数据框如下所示:用户 ID:ACF3 问题 ID:M332 所用时间:55

标签: python pandas group-by


【解决方案1】:

这应该可以解决问题:

import pandas as pd

DF = pd.DataFrame
S = pd.Series


def gt_60_mins_taken(df: DF) -> S:
    assert str(df["Time Taken"].dtype) == "timedelta64[ns]"
    mins_taken = df["Time Taken"].dt.total_seconds() / 60
    return mins_taken > 60


def handle_single_user(dfg: DF) -> S:
    n_uniq_issues = dfg["Issue ID"].nunique()
    n_uniq_issues_where_took_gt_60mins = dfg.loc[gt_60_mins_taken, "Issue ID"].nunique()
    frac_uniq_issues_took_gt_60mins = n_uniq_issues_where_took_gt_60mins / n_uniq_issues
    data = dict(
        n_uniq_issues=n_uniq_issues,
        n_uniq_issues_where_took_gt_60mins=n_uniq_issues_where_took_gt_60mins,
        frac_uniq_issues_took_gt_60mins=frac_uniq_issues_took_gt_60mins,
    )
    return S(data)


sample_data = {
    "User ID": [0, 0, 1, 2, 2, 2],
    "Issue ID": [100, 101, 103, 101, 100, 100],
    "Time Taken": pd.to_timedelta(
        ["30 seconds", "70 minutes", "10 hours", "5 seconds", "8 minutes", "100 minutes"]
    ),
}

sample_df = DF(sample_data).astype(
    {
        "User ID": "int64",
        "Issue ID": "int64",
        "Time Taken": "timedelta64[ns]",
    }
)

output_df = (
    sample_df.groupby("User ID")
    .apply(handle_single_user)
    .reset_index()
    .astype(
        {
            "User ID": "int64",
            "n_uniq_issues": "int64",
            "n_uniq_issues_where_took_gt_60mins": "int64",
            "frac_uniq_issues_took_gt_60mins": "float64",
        }
    )
)

expected_output_df = DF(
    {
        "User ID": [0, 1, 2],
        "n_uniq_issues": [2, 1, 2],
        "n_uniq_issues_where_took_gt_60mins": [1, 1, 1],
        "frac_uniq_issues_took_gt_60mins": [0.5, 1.0, 0.5],
    }
)
pd.testing.assert_frame_equal(output_df, expected_output_df)

output_df.to_excel("/path/to/doc.xlsx")

【讨论】:

  • 嗨,奥斯汀,非常感谢。更改某些数据类型后,我能够使用您的代码。谢谢!!!最后一个问题,如果我想每月运行一次并将报告导出到下一个空行,你知道我该怎么做吗?总之,非常感谢!!
猜你喜欢
  • 1970-01-01
  • 2017-03-20
  • 1970-01-01
  • 2020-04-04
  • 1970-01-01
  • 1970-01-01
  • 2022-07-12
  • 2019-11-18
  • 1970-01-01
相关资源
最近更新 更多