Rob*_*Rob 5 python dataframe pandas
我正在使用一个多索引数据框,该数据框以日期列和 location_id 作为索引。
index_1 = ['2020-01-01', '2020-01-03', '2020-01-04']
index_2 = [100,200,300]
index = pd.MultiIndex.from_product([index_1,
index_2], names=['Date', 'location_id'])
df = pd.DataFrame(np.random.randint(10,100,9), index)
df
0
Date location_id
2020-01-01 100 19
200 75
300 39
2020-01-03 100 11
200 91
300 80
2020-01-04 100 36
200 56
300 54
Run Code Online (Sandbox Code Playgroud)
我想填写缺失的日期,只用一个 location_id 并用 0 填充:
0
Date location_id
2020-01-01 100 19
200 75
300 39
2020-01-02 100 0
2020-01-03 100 11
200 91
300 80
2020-01-04 100 36
200 56
300 54
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?这很有帮助,但前提是我的数据框不是多重索引的。
您可以获取unique日期索引级别的值,生成最小和最大之间的所有日期,pd.date_range并使用difference日期的唯一值来获取丢失的日期。然后用原始索引的reindexdf和由缺失日期组成的 df 以及级别 location_id 的 df 。unionMultiIndex.from_productmin
#unique dates
m = df.index.unique(level=0)
# reindex
df = df.reindex(df.index.union(
pd.MultiIndex.from_product([pd.date_range(m.min(), m.max())
.difference(pd.to_datetime(m))
.strftime('%Y-%m-%d'),
[df.index.get_level_values(1).min()]])),
fill_value=0)
print(df)
0
2020-01-01 100 91
200 49
300 19
2020-01-02 100 0
2020-01-03 100 41
200 25
300 51
2020-01-04 100 44
200 40
300 54
Run Code Online (Sandbox Code Playgroud)
pd.MultiIndex.from_product您还可以使用productfrom来代替itertools。结果相同但可能更快。
from itertools import product
df = df.reindex(df.index.union(
list(product(pd.date_range(m.min(), m.max())
.difference(pd.to_datetime(m))
.strftime('%Y-%m-%d'),
[df.index.get_level_values(1).min()]))),
fill_value=0)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1574 次 |
| 最近记录: |