通过在 groupby 之后删除 nan 来合并 DataFrame 中的行
Merge rows in DataFrame by removing nan's after groupby
给出如下所示的 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
我想合并具有相同外部索引的行(请注意,在每种情况下,只有一个非 nan 值)。
我目前的解决方案涉及两个分组操作:
df.index = df.index.droplevel(1)
df.groupby(df.index).ffill().groupby(df.index).last()
并给了我预期的结果:
Out:
a b
Project
Project 1 foo one
Project 2 bar two
必须使用两个 groupby 操作似乎过多,因为我需要的只是一个聚合函数,returns 列表中的单个非 nan 值。但是,我想不出将 dropna 用作聚合函数的方法。
您可以使用 reset_index, stack and unstack:
In [131]: df.reset_index(level=1, drop=True).stack().unstack()
Out[131]:
a b
Project
Project 1 foo one
Project 2 bar two
groupby
上的 last
方法获取最后一个有效值。 first
在这种情况下会完成同样的事情。
df.groupby(level='Project').last()
给出如下所示的 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
我想合并具有相同外部索引的行(请注意,在每种情况下,只有一个非 nan 值)。
我目前的解决方案涉及两个分组操作:
df.index = df.index.droplevel(1)
df.groupby(df.index).ffill().groupby(df.index).last()
并给了我预期的结果:
Out:
a b
Project
Project 1 foo one
Project 2 bar two
必须使用两个 groupby 操作似乎过多,因为我需要的只是一个聚合函数,returns 列表中的单个非 nan 值。但是,我想不出将 dropna 用作聚合函数的方法。
您可以使用 reset_index, stack and unstack:
In [131]: df.reset_index(level=1, drop=True).stack().unstack()
Out[131]:
a b
Project
Project 1 foo one
Project 2 bar two
groupby
上的 last
方法获取最后一个有效值。 first
在这种情况下会完成同样的事情。
df.groupby(level='Project').last()