Python 在时间序列数据框中填充零并保留现有值
Posted
技术标签:
【中文标题】Python 在时间序列数据框中填充零并保留现有值【英文标题】:Python fill zeros in a timeseries dataframe and keep existing values 【发布时间】:2019-09-17 10:39:15 【问题描述】:我有一个日期列表和一个数据框。现在数据框有一个 id 列和其他所有日期不一致的值。我想在没有数据的 id 和日期的所有列中填充零。让我举例说明:
date id clicks conv rev
2019-01-21 234 34 1 10
2019-01-21 235 32 0 0
2019-01-24 234 56 2 20
2019-01-23 235 23 3 30
日期列表是这样的:
[2019-01-01, 2019-01-02,2019-01-03 ....2019-02-28]
我想要的是为所有 id 的数据框中的所有缺失日期添加零。所以结果 df 应该是这样的:
date id clicks conv rev
2019-01-01 234 0 0 0
2019-01-01 235 0 0 0
. . . .
. . . .
2019-01-21 234 34 1 10
2019-01-21 235 32 0 0
2019-01-22 234 0 0 0
2019-01-22 235 0 0 0
2019-01-23 234 0 0 0
2019-01-23 235 0 0 0
2019-01-24 234 56 2 20
2019-01-23 235 23 3 30
. . . .
2019-02-28 0 0 0 0
【问题讨论】:
your_data_frame.fillna(0)
为什么只有 0,看看 pandas.pydata.org/pandas-docs/stable/reference/api/… 和来自 sklearn.impute.SimpleImputer
请仔细阅读问题@SmartManoj
【参考方案1】:
使用DataFrame.reindex
和MultiIndex
,也需要将list
和列date
转换为datetime
s:
dates = ['2019-01-01', '2019-01-21','2019-01-22','2019-01-23', '2019-01-24']
mux = pd.MultiIndex.from_product([pd.DatetimeIndex(dates),
df['id'].unique()], names=['date','id'])
df['date'] = pd.to_datetime(df['date'])
df = df.set_index(['date','id']).reindex(mux, fill_value=0).reset_index()
print (df)
date id clicks conv rev
0 2019-01-01 234 0 0 0
1 2019-01-01 235 0 0 0
2 2019-01-21 234 34 1 10
3 2019-01-21 235 32 0 0
4 2019-01-22 234 0 0 0
5 2019-01-22 235 0 0 0
6 2019-01-23 234 0 0 0
7 2019-01-23 235 23 3 30
8 2019-01-24 234 56 2 20
9 2019-01-24 235 0 0 0
验证数据类型:
print (df['date'].dtype)
datetime64[ns]
print (mux.levels[0].dtype)
datetime64[ns]
【讨论】:
这段代码会保留现有的非零值吗?我有一个类似的代码,但它对所有日期都复制零 @Nofy -print (df.info())
是什么?
数据列(共 11 列):dtypes: float64(2), int64(7), object(2) 是的,我验证了,我的解决方案也全为零
@Nofy - 对我来说工作得很好,将日期都转换为日期时间 - 在列表和列中?
未将列转换为日期时间。现在它正在工作。抓得好!以上是关于Python 在时间序列数据框中填充零并保留现有值的主要内容,如果未能解决你的问题,请参考以下文章
Python:如何在比较其他列时将列值填充到另一个数据框中的新列?