根据数据框中的其他列值创建新列值

时间:2021-07-27 21:35:53

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

我有一个数据框,下面给出了它的一个片段。

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)

enter image description here

我正在寻找一个看起来像这样的最终结果。

enter image description here

说明:对于每个ID,study_date从开始日期开始到最后一个日期结束。中间缺少的日期必须填写。如果原始数据框中缺少日期,则“missing_date”列的值为 1 或 0。学习日列是从开始天数到结束天数按顺序递增的天数。

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

1 个答案:

答案 0 :(得分: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