我有一個類似于以下內容的資料框:
test = {"id": ["A", "A", "A", "B", "B", "B"],
"date": ["09-02-2013", "09-03-2013", "09-05-2013", "09-15-2013", "09-17-2013", "09-18-2013"],
"country": ["Poland", "Poland", "France", "Scotland", "Scotland", "Canada"]}
我想要一個回傳這個的表:
| ID | 日期 | 國家 |
|---|---|---|
| 一個 | 09-02-2013 | 波蘭 |
| 一個 | 09-03-2013 | 波蘭 |
| 一個 | 09-04-2013 | 波蘭 |
| 一個 | 09-05-2013 | 法國 |
| 乙 | 09-15-2013 | 蘇格蘭 |
| 乙 | 09-16-2013 | 蘇格蘭 |
| 乙 | 09-17-2013 | 蘇格蘭 |
| 乙 | 09-18-2013 | 加拿大 |
即填寫我丟失的任何日期但只會填寫每個ID的最小/最大值的表格
我已經查看了堆疊溢位,但通常這個問題只有一個索引,或者這個人無論如何都想洗掉一個索引這是我到目前為止所得到的:
test_df = pd.DataFrame(test)
# get min date per id
dates = test_df.groupby("id")["date"].min().to_frame(name="min")
# get max date
dates["max"] = test_df.groupby("id")["date"].max().to_frame(name="max")
midx = pd.MultiIndex.from_frame(dates.apply(lambda x: pd.date_range(x["min"], x["max"], freq="D"), axis=1).explode().reset_index(name="date")[["date", "id"]])
test_df = test_df.set_index(["date", "id"])
test_df = test_df.reindex(midx).fillna(method="ffill")
test_df
這讓我非常接近但并不完全在那里,日期都在那里但沒有國家:
| ID | 日期 | 國家 |
|---|---|---|
| 一個 | 09-02-2013 | 鈉 |
| 一個 | 09-03-2013 | 鈉 |
| 一個 | 09-04-2013 | 鈉 |
| 一個 | 09-05-2013 | 鈉 |
| 乙 | 09-15-2013 | 鈉 |
| 乙 | 09-16-2013 | 鈉 |
| 乙 | 09-17-2013 | 鈉 |
| 乙 | 09-18-2013 | 鈉 |
關于如何解決它的任何想法?
uj5u.com熱心網友回復:
IIUC,您可以生成date_range每組explode,然后merge和ffill每組的值:
out = (test_df
.merge(pd
.to_datetime(test_df['date'], dayfirst=False)
.groupby(test_df['id'])
.apply(lambda g: pd.date_range(g.min(), g.max(), freq='D'))
.explode().dt.strftime('%m-%d-%Y')
.reset_index(name='date'),
how='right'
)
.assign(country=lambda d: d.groupby('id')['country'].ffill())
)
輸出:
id date country
0 A 09-02-2013 Poland
1 A 09-03-2013 Poland
2 A 09-04-2013 Poland
3 A 09-05-2013 France
4 B 09-15-2013 Scotland
5 B 09-16-2013 Scotland
6 B 09-17-2013 Scotland
7 B 09-18-2013 Canada
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/494361.html
