假設我在 Pandas 中有以下 DataFrame
| 日期 | 顧客 | 出席 |
|---|---|---|
| 2022-01-01 | 約翰 | 真的 |
| 2022-01-02 | 約翰 | 真的 |
| 2022-01-04 | 約翰 | 真的 |
| 2022-01-05 | 標記 | 真的 |
我可以做哪些轉換來填補給定頻率的日期中缺失的空白(在這種情況下是每天,但可以通過任何其他頻率)所以它最終像這樣:
| 日期 | 顧客 | 出席 |
|---|---|---|
| 2022-01-01 | 約翰 | 真的 |
| 2022-01-01 | 標記 | 錯誤的 |
| 2022-01-02 | 約翰 | 真的 |
| 2022-01-02 | 標記 | 錯誤的 |
| 2022-01-03 | 約翰 | 錯誤的 |
| 2022-01-03 | 標記 | 錯誤的 |
| 2022-01-04 | 約翰 | 真的 |
| 2022-01-04 | 標記 | 錯誤的 |
| 2022-01-05 | 約翰 | 錯誤的 |
| 2022-01-05 | 標記 | 真的 |
這可以通過僅過濾一個客戶并與另一個具有所有日期的DataFrame進行外部連接來在個人級別上完成,它會用NaN填充空的,但我不能對所有不同的人都這樣做在客戶這是我需要做的。我很欣賞一種在計算上盡可能高效且不涉及對資料集進行大量復雜迭代的方法。
uj5u.com熱心網友回復:
pivot讓我們用 date_range reindex 試試stack:
tmp = df.pivot('date','customer','attended')
tmp.index = pd.to_datetime(tmp.index)
out = tmp.reindex(pd.date_range(tmp.index[0], tmp.index[-1])).fillna(False).stack().reset_index().rename(columns={0:'attended'})
輸出:
level_0 customer attended
0 2022-01-01 John True
1 2022-01-01 Mark False
2 2022-01-02 John True
3 2022-01-02 Mark False
4 2022-01-03 John False
5 2022-01-03 Mark False
6 2022-01-04 John True
7 2022-01-04 Mark False
8 2022-01-05 John False
9 2022-01-05 Mark True
uj5u.com熱心網友回復:
這是一種方式(df您的資料框):
df.date = pd.to_datetime(df.date) # Just in case
customers = df.customer.unique()
df_fill = pd.DataFrame(
(
[day, customer]
for day in pd.date_range(df.date.min(), df.date.max(), freq="D")
for customer in customers
),
columns=["date", "customer"]
)
df = df_fill.merge(df, on=["date", "customer"], how="left")
df.attended = df.attended.fillna(False)
輸出:
date customer attended
0 2022-01-01 John True
1 2022-01-01 Mark False
2 2022-01-02 John True
3 2022-01-02 Mark False
4 2022-01-03 John False
5 2022-01-03 Mark False
6 2022-01-04 John True
7 2022-01-04 Mark False
8 2022-01-05 John False
9 2022-01-05 Mark True
uj5u.com熱心網友回復:
一種選擇是使用pyjanitor的完整功能,以公開顯式缺失的行:
# pip install pyjanitor
import pandas as pd
import janitor
# generate new dates
new_dates = {"date": pd.date_range(df.date.min(), df.date.max(), freq="D")}
df.complete(new_dates, 'customer', sort = True).fillna({'attended':False})
date customer attended
0 2022-01-01 John True
1 2022-01-01 Mark False
2 2022-01-02 John True
3 2022-01-02 Mark False
4 2022-01-03 John False
5 2022-01-03 Mark False
6 2022-01-04 John True
7 2022-01-04 Mark False
8 2022-01-05 John False
9 2022-01-05 Mark True
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/428708.html
上一篇:如何重命名熊貓中的嵌套列組?
