簡體   English   中英

如何填充 Pandas DataFrame 中缺失的時間值?

[英]How to fill missing time values in Pandas DataFrame?

在此處輸入圖像描述

第三列顯示每個用戶從 2019 年 4 月 1 日到 2019 年 4 月 30 日的時間數據。 對於一些用戶來說,有些日子不見了。 我可以做些什么來保持每個用戶的每月范圍,而其余的列都用零填充?

使用從開始到結束日期的unique user_ids 和pd.date_range嘗試MultiIndex.from_product

cols = ['user_id', 'date']
midx = pd.MultiIndex.from_product(
    (df['user_id'].unique(),
     pd.date_range(start='2019-04-01', end='2019-04-30', freq='D')),
    names=cols
)

然后set_index + reindex

df = (
    df.set_index(cols)
        .reindex(midx, fill_value=0)
        .reset_index()
)

修復日期列(可選):

df['day'] = df['date'].dt.day

樣品架:

df = pd.DataFrame({
    'user_id': [99, 99, 100, 100],
    'date': ['2019-04-01', '2019-04-15', '2019-04-03', '2019-04-28'],
    'day': [1, 15, 3, 28],
    'count': [38, 39, 60, 57]
})
df['date'] = pd.to_datetime(df['date'])
   user_id       date  day  count
0       99 2019-04-01    1     38
1       99 2019-04-15   15     39
2      100 2019-04-03    3     60
3      100 2019-04-28   28     57

Output:

    user_id       date  day  count
0        99 2019-04-01    1     38
1        99 2019-04-02    2      0
                  ...
13       99 2019-04-14   14      0
14       99 2019-04-15   15     39
15       99 2019-04-16   16      0
                  ...
28       99 2019-04-29   29      0
29       99 2019-04-30   30      0
30      100 2019-04-01    1      0
31      100 2019-04-02    2      0
32      100 2019-04-03    3     60
33      100 2019-04-04    4      0
34      100 2019-04-05    5      0
                  ...
54      100 2019-04-25   25      0
55      100 2019-04-26   26      0
56      100 2019-04-27   27      0
57      100 2019-04-28   28     57
58      100 2019-04-29   29      0
59      100 2019-04-30   30      0

完整的工作示例:

import pandas as pd

df = pd.DataFrame({
    'user_id': [99, 99, 100, 100],
    'date': ['2019-04-01', '2019-04-15', '2019-04-03', '2019-04-28'],
    'day': [1, 15, 3, 28],
    'count': [38, 39, 60, 57]
})
df['date'] = pd.to_datetime(df['date'])

# Columns to Reindex
cols = ['user_id', 'date']
# Create Multi Index
midx = pd.MultiIndex.from_product(
    (df['user_id'].unique(),
     pd.date_range(start='2019-04-01', end='2019-04-30', freq='D')),
    names=cols
)
# Reindex
df = (
    df.set_index(cols)
        .reindex(midx, fill_value=0)
        .reset_index()
)
# Fix Day Column
df['day'] = df['date'].dt.day

print(df)

使用groupby() + reindex()

def fill_missing_dates(df):
    return (
        df.set_index("date")
        .reindex(pd.date_range("2019-04-01", "2019-04-30"), fill_value=0)
        .assign(day=lambda x: x.index.day)  # set correct day column
        .reset_index()
    )

df.groupby("user_id", as_index=False).apply(fill_missing_dates).reset_index(drop=True)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM