早上好,
现在我的数据框看起来像这样:
date | type | value
2021-01-01 | extern | 17
2021-01-01 | intern | 19.5
2021-01-02 | extern | 104
2021-01-02 | intern | 8
2021-01-03 | extern | 17.4
2021-01-04 | intern | 34
如您所见,日期 2021-01-03 和 2021-01-04 缺少行,因为两者都没有 extern 和 实习生 价值观。我想知道是否有可能将这个数据框变成这样的:
date | type | value
2021-01-01 | extern | 17
2021-01-01 | intern | 19.5
2021-01-02 | extern | 104
2021-01-02 | intern | 8
2021-01-03 | extern | 17.4
2021-01-03 | intern | 0
2021-01-04 | intern | 34
2021-01-04 | extern | 0
注意事项:
希望有人知道这种情况的解决方案!?感谢我们的帮助和美好的一天!
答案 0 :(得分:2)
您可以使用 complete 中的 pyjanitor 函数来暴露缺失的组合;目前您必须从 github:
安装最新的开发版本# install latest dev version
# pip install git+https://github.com/ericmjl/pyjanitor.git
import janitor
df.complete(["date", "type"], fill_value={"value": 0})
date type value
0 2021-01-01 extern 17.0
1 2021-01-01 intern 19.5
2 2021-01-02 extern 104.0
3 2021-01-02 intern 8.0
4 2021-01-03 extern 17.4
5 2021-01-03 intern 0.0
6 2021-01-04 extern 0.0
7 2021-01-04 intern 34.0
仅使用 Pandas',我们可以为列 'A' 和 'B' 创建唯一值,构建新的 MultiIndex,然后重新索引数据框:
new_index = pd.MultiIndex.from_product(
[df.date.unique(), df.type.unique()], names=["date", "type"])
new_index
MultiIndex([('2021-01-01', 'extern'),
('2021-01-01', 'intern'),
('2021-01-02', 'extern'),
('2021-01-02', 'intern'),
('2021-01-03', 'extern'),
('2021-01-03', 'intern'),
('2021-01-04', 'extern'),
('2021-01-04', 'intern')],
names=['date', 'type'])
现在,set index、reindex 和 reset index:
df.set_index(["date", "type"]).reindex(new_index, fill_value=0).reset_index()
date type value
0 2021-01-01 extern 17.0
1 2021-01-01 intern 19.5
2 2021-01-02 extern 104.0
3 2021-01-02 intern 8.0
4 2021-01-03 extern 17.4
5 2021-01-03 intern 0.0
6 2021-01-04 extern 0.0
7 2021-01-04 intern 34.0