将 DataFrame 与“不均匀”数据合并

Rib*_*950 2 python pandas

请原谅标题,我什至不确定如何标记我正在尝试做的事情。我在 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。但我什么也做不了。

做这个的最好方式是什么?

sam*_*mmy 5

您必须利用 Pandas 的索引来重塑数据:

步骤 1:从和列的唯一值创建一个新索引NameMonth

new_index = pd.MultiIndex.from_product(
    (df.Name.unique(), df.Month.unique()), names=["Name", "Month"]
)
Run Code Online (Sandbox Code Playgroud)

步骤 2:设置NameMonth作为新索引,使用和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)


cs9*_*s95 5

您可以将月份视为分类列,然后允许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 来处理缺失的“类别”。

警告:这总是对您的数据进行排序。

  • 现在这很有趣!我喜欢秘制酱汁。+1 (2认同)