Pandas 在 groupby 和 nlargest 之后创建额外(重复)索引

Posted

技术标签:

【中文标题】Pandas 在 groupby 和 nlargest 之后创建额外(重复)索引【英文标题】:Pandas creating extra (duplicated) index after groupby and nlargest 【发布时间】:2017-10-19 20:09:36 【问题描述】:

我尝试使用stack().groupby().nlargest().unstack() 链在 Pandas 数据框中找到每一行中最大的 N 个元素。但是,有时原始索引会重复。其他时候则不然。这种行为的不一致导致后续处理非常困难。有谁知道是什么触发了差异,以及如何强制保持一致性?

例如,这里有一个索引[x y z]在末尾重复的情况:

>>> df = pd.DataFrame('A':[np.nan,8,9], 'B':[0,np.nan,5], 'C':[2, 10, np.nan], index='x y z'.split())
>>> df
     A    B     C
x  NaN  0.0   2.0
y  8.0  NaN  10.0
z  9.0  5.0   NaN
>>> df.stack().groupby(level=0).nlargest(1).unstack()
       A     C
x x  NaN   2.0
y y  NaN  10.0
z z  9.0   NaN

而在这种情况下它不是:

>>> df1 = pd.DataFrame('A':[np.nan,np.nan,9], 'B':[0,np.nan,np.nan], 'C':[np.nan, 10, np.nan], index='x y z'.split())
>>> df1
     A    B     C
x  NaN  0.0   NaN
y  NaN  NaN  10.0
z  9.0  NaN   NaN
>>> df1.stack().groupby(level=0).nlargest(1).unstack()
     A    B     C
x  NaN  0.0   NaN
y  NaN  NaN  10.0
z  9.0  NaN   NaN

【问题讨论】:

【参考方案1】:

您需要的是dropna=False 方法中的参数.stack()

df = pd.DataFrame('A':[np.nan,8,9], 'B':[0,np.nan,5], 'C':[2, 10, np.nan], index='x y z'.split())
df.stack(dropna=False).groupby(level=0).nlargest(1).unstack()

输出:

       A     C
x x  NaN   2.0
y y  NaN  10.0
z z  9.0   NaN

df1 = pd.DataFrame('A':[np.nan,np.nan,9], 'B':[0,np.nan,np.nan], 'C':[np.nan, 10, np.nan], index='x y z'.split())
df1.stack(dropna=False).groupby(level=0).nlargest(1).unstack()

输出:

       A    B     C
x x  NaN  0.0   NaN
y y  NaN  NaN  10.0
z z  9.0  NaN   NaN

【讨论】:

以上是关于Pandas 在 groupby 和 nlargest 之后创建额外(重复)索引的主要内容,如果未能解决你的问题,请参考以下文章

Pandas高级教程之:GroupBy用法

Pandas 在 groupby 和 nlargest 之后创建额外(重复)索引

使用 Groupby 的 Pandas 滚动函数

(pandas) 根据 groupby 和 column 条件填充 NaN

Pandas 使用 groupby 和模式填充

在 pandas 中查找 groupby 的索引