我尝试使用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
答案 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