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

时间:2017-05-19 15:58:39

标签: pandas indexing group-by duplicates

我尝试使用stack().groupby().nlargest().unstack()链找到Pandas Dataframe中每行的最大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 个答案:

答案 0 :(得分:0)

您需要的是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