请原谅标题,我什至不确定如何标记我正在尝试做的事情。我在 DataFrame 中有如下所示的数据:
Name Month Status
---- ----- ------
Bob Jan Good
Bob Feb Good
Bob Mar Bad
Martha Feb Bad
John Jan Good
John Mar Bad
Run Code Online (Sandbox Code Playgroud)
并非每个名称 'Name' 都有每个 'Month' 和 'Status'。我想得到的是:
Name Month Status
---- ----- ------
Bob Jan Good
Bob Feb Good
Bob Mar Bad
Martha Jan N/A
Martha Feb Bad
Martha Mar N/A
John Jan Good
John Feb N/A
John Mar Bad
Run Code Online (Sandbox Code Playgroud)
缺少的月份用“状态”列中的值填充。
到目前为止,我尝试做的是将所有唯一的“Month”值导出到一个列表,转换为 DataFrame,然后加入/合并两个 DataFrame。但我什么也做不了。
做这个的最好方式是什么?
您必须利用 Pandas 的索引来重塑数据:
步骤 1:从和列的唯一值创建一个新索引:Name
Month
new_index = pd.MultiIndex.from_product(
(df.Name.unique(), df.Month.unique()), names=["Name", "Month"]
)
Run Code Online (Sandbox Code Playgroud)
步骤 2:设置Name
并Month
作为新索引,使用和reset_index重新索引以获得最终输出:new_index
df.set_index(["Name", "Month"]).reindex(new_index).reset_index()
Run Code Online (Sandbox Code Playgroud)
更新2021/01/08:
您可以使用pyjanitor的完整功能;目前你必须从github安装最新的开发版本:
# install latest dev version
# pip install git+https://github.com/ericmjl/pyjanitor.git
import pyjanitor
df.complete(["Name", "Month"])
Run Code Online (Sandbox Code Playgroud)
您可以将月份视为分类列,然后允许GroupBy
进行繁重的工作:
df['Month'] = pd.Categorical(df['Month'])
df.groupby(['Name', 'Month'], as_index=False).first()
Name Month Status
0 Bob Feb Good
1 Bob Jan Good
2 Bob Mar Bad
3 John Feb NaN
4 John Jan Good
5 John Mar Bad
6 Martha Feb Bad
7 Martha Jan NaN
8 Martha Mar NaN
Run Code Online (Sandbox Code Playgroud)
这里的秘诀是熊猫通过在那里插入一个 NaN 来处理缺失的“类别”。
警告:这总是对您的数据进行排序。