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 和 nlargest 之后创建额外(重复)索引