通过在groupby之后删除nan来合并DataFrame中的行

Pat*_*llo 3 python nan dataframe pandas

给出如下所示的DataFrame:

import numpy as np
import pandas as pd
from pandas import DataFrame

idx = pd.MultiIndex.from_product([["Project 1", "Project 2"], range(1,3)],
                         names=['Project', 'Ord'])
df = DataFrame({'a': ["foo", np.nan, np.nan, "bar"],
                'b': [np.nan, "one", "two", np.nan]},
               index=idx)

Out:

                 a    b
Project   Ord          
Project 1 1    foo  NaN
          2    NaN  one
Project 2 1    NaN  two
          2    bar  NaN
Run Code Online (Sandbox Code Playgroud)

我想合并具有相同外部索引的行(请注意,在每种情况下,只有一个非nan值)。

我当前使用的解决方案涉及两个分组操作:

df.index = df.index.droplevel(1)
df.groupby(df.index).ffill().groupby(df.index).last()
Run Code Online (Sandbox Code Playgroud)

并给了我预期的结果:

Out:
             a    b
Project            
Project 1  foo  one
Project 2  bar  two
Run Code Online (Sandbox Code Playgroud)

必须使用两个groupby-operation似乎过多,因为我需要的是一个聚合函数,该函数从列表中返回单个非nan值。但是,我无法想到将dropna用作聚合函数的方法。

Max*_*axU 5

你可以使用reset_index堆栈拆散

In [131]: df.reset_index(level=1, drop=True).stack().unstack()
Out[131]:
             a    b
Project
Project 1  foo  one
Project 2  bar  two
Run Code Online (Sandbox Code Playgroud)