python - 按日期拉伸(stretch)数据框

标签 python pandas numpy

我有这个数据框:

ID      date  X1  X2  Y
 A  16-07-19  58  50  0
 A  21-07-19  28  74  0
 B  25-07-19  54  65  1
 B  27-07-19  50  30  0
 B  29-07-19  81  61  0
 C  30-07-19  55  29  0
 C  31-07-19  97  69  1
 C  03-08-19  13  48  1
 D  19-07-18  77  27  1
 D  20-07-18  68  50  1
 D  22-07-18  89  57  1
 D  23-07-18  46  70  0
 D  26-07-18  56  13  0
 E  06-08-19  47  35  1

我想按日期“拉伸(stretch)”数据,从第一行到每个 ID 的最后一行 (分组依据), 并用 NaN 填充缺失值。

例如:ID A16-07-1921-07-19 上有两行。 实现后,他(她)在2019年7月16-21日应该有6行。

预期结果:

ID      date    X1    X2    Y
 A  16-07-19  58.0  50.0  0.0
 A  17-07-19   NaN   NaN  NaN
 A  18-07-19   NaN   NaN  NaN
 A  19-07-19   NaN   NaN  NaN
 A  20-07-19   NaN   NaN  NaN
 A  21-07-19  28.0  74.0  0.0
 B  25-07-19  54.0  65.0  1.0
 B  26-07-19   NaN   NaN  NaN
 B  27-07-19  50.0  30.0  0.0
 B  28-07-19   NaN   NaN  NaN
 B  29-07-19  81.0  61.0  0.0
 C  30-07-19  55.0  29.0  0.0
 C  31-07-19  97.0  69.0  1.0
 C  01-08-19   NaN   NaN  NaN
 C  02-08-19   NaN   NaN  NaN
 C  03-08-19  13.0  48.0  1.0
 D  19-07-18  77.0  27.0  1.0
 D  20-07-18  68.0  50.0  1.0
 D  21-07-18   NaN   NaN  NaN
 D  22-07-18  89.0  57.0  1.0
 D  23-07-18  46.0  70.0  0.0
 D  24-07-18   NaN   NaN  NaN
 D  25-07-18   NaN   NaN  NaN
 D  26-07-18  56.0  13.0  0.0
 E  06-08-19  47.0  35.0  1.0

最佳答案

使用DataFrame.asfreq每个使用 DatetimeIndex 的组:

df['date'] = pd.to_datetime(df['date'], dayfirst=True)

cols = df.columns.difference(['date','ID'], sort=False)
df = df.set_index('date').groupby('ID')[cols].apply(lambda x: x.asfreq('d')).reset_index()
print (df)
   ID       date    X1    X2    Y
0   A 2019-07-16  58.0  50.0  0.0
1   A 2019-07-17   NaN   NaN  NaN
2   A 2019-07-18   NaN   NaN  NaN
3   A 2019-07-19   NaN   NaN  NaN
4   A 2019-07-20   NaN   NaN  NaN
5   A 2019-07-21  28.0  74.0  0.0
6   B 2019-07-25  54.0  65.0  1.0
7   B 2019-07-26   NaN   NaN  NaN
8   B 2019-07-27  50.0  30.0  0.0
9   B 2019-07-28   NaN   NaN  NaN
10  B 2019-07-29  81.0  61.0  0.0
11  C 2019-07-30  55.0  29.0  0.0
12  C 2019-07-31  97.0  69.0  1.0
13  C 2019-08-01   NaN   NaN  NaN
14  C 2019-08-02   NaN   NaN  NaN
15  C 2019-08-03  13.0  48.0  1.0
16  D 2018-07-19  77.0  27.0  1.0
17  D 2018-07-20  68.0  50.0  1.0
18  D 2018-07-21   NaN   NaN  NaN
19  D 2018-07-22  89.0  57.0  1.0
20  D 2018-07-23  46.0  70.0  0.0
21  D 2018-07-24   NaN   NaN  NaN
22  D 2018-07-25   NaN   NaN  NaN
23  D 2018-07-26  56.0  13.0  0.0
24  E 2019-08-06  47.0  35.0  1.0

另一个想法 DataFrame.reindex每组:

df['date'] = pd.to_datetime(df['date'], dayfirst=True)

cols = df.columns.difference(['date','ID'], sort=False)
f = lambda x: x.reindex(pd.date_range(x.index.min(), x.index.max()))
df = df.set_index('date').groupby('ID')[cols].apply(f).reset_index()

关于python - 按日期拉伸(stretch)数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60146048/

相关文章:

python - Pandas 中的插值水平独立于每行

python - 带有来自 Pandas DataFrame 的数据的 Spacy NLP

pandas - 处理异构数据和大 'binary'数据

python - 如何在不丢失白色区域形状的情况下从白色区域中去除噪声

python - 了解张量点

python - 当两个数组都已排序时,更快的搜索排序方法

python - 如何阻止值返回 'None' ?

python - 属性错误 : type object 'datetime.date' has no attribute 'now'

python - 无法使用 Django 和 Python 添加带有按钮的 Bootstrap 类

python - 将 for 循环的输出写入 pandas 数据帧