【问题标题】:creating new column values depending on other column values in a dataframe根据数据框中的其他列值创建新列值
【发布时间】:2021-10-03 16:48:15
【问题描述】:

我有一个数据框,下面给出了它的 sn-p。

data = {'ID':['A', 'A', 'A,'A', 'B', 'B', 'B', 'B', 'C', 'C'],
    'Date':['03/25/2021', '03/25/2021',03/27/2021', '03/29/2021', '03/10/2021','03/11/2021','03/15/2021','03/16/2021', '03/21/2021','03/25/2021']}

df = pd.DataFrame(data)

我正在寻找应该是这样的最终结果。

说明:对于每个ID,study_date从开始日期开始,到最后一个日期结束。中间缺的日期要补上。如果原始数据框中缺少日期,则“missing_date”列的值为 1,否则为 0。研究日列是从开始天到结束天的天数,按顺序递增。

我尝试了一些东西,但我已经坚持了一段时间了。任何帮助是极大的赞赏。 谢谢。

【问题讨论】:

    标签: python-3.x pandas dataframe series data-processing


    【解决方案1】:

    试试:

    def fn(x):
        dr = pd.date_range(x["Date"].min(), x["Date"].max())
        out = pd.DataFrame({"Date": dr}, index=range(1, len(dr) + 1))
        out["Missing_Date"] = (~out["Date"].isin(x["Date"])).astype(int)
        return out
    
    
    # if the "Date" column is not converted:
    df["Date"] = pd.to_datetime(df["Date"])
    
    x = (
        df.groupby("ID")
        .apply(fn)
        .reset_index()
        .rename(columns={"level_1": "StudyDay"})
    )
    print(x)
    

    打印:

       ID  StudyDay       Date  Missing_Date
    0   A         1 2021-03-25             0
    1   A         2 2021-03-26             1
    2   A         3 2021-03-27             0
    3   A         4 2021-03-28             1
    4   A         5 2021-03-29             0
    5   B         1 2021-03-10             0
    6   B         2 2021-03-11             0
    7   B         3 2021-03-12             1
    8   B         4 2021-03-13             1
    9   B         5 2021-03-14             1
    10  B         6 2021-03-15             0
    11  B         7 2021-03-16             0
    12  C         1 2021-03-21             0
    13  C         2 2021-03-22             1
    14  C         3 2021-03-23             1
    15  C         4 2021-03-24             1
    16  C         5 2021-03-25             0
    

    【讨论】:

    • 这工作得很好。对问题的一个小补充/编辑,如果有多个相同日期的条目,那么“study_day”必须是“1”和“1”,如图所示。当前代码会删除重复输入的日期(如果有)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 2020-04-12
    • 1970-01-01
    • 2021-09-15
    • 2017-01-03
    • 1970-01-01
    相关资源
    最近更新 更多