将列相加并选择总和最大的列

jen*_*ryb 3 python sorting sum dataframe pandas

我正在寻找对数据框进行排序。我有这个数据框:

Y    X1  X2  X3
Y1   1   0   1
Y2   1   0   0
Y3   1   0   0
Y4   0   1   0
Run Code Online (Sandbox Code Playgroud)

有很多列。如果您将列相加,我想选择总和最大的 X 值。

我一直在尝试通过添加一行来做到这一点,如下所示:

Y    X1  X2  X3
Y1   1   0   1
Y2   1   0   0
Y3   1   0   0
Y4   0   1   1
sum  3   1   2
Run Code Online (Sandbox Code Playgroud)

然后我会按总和行对其进行排序

Y    X1  X3  X2
Y1   1   1   0
Y2   1   0   0
Y3   1   0   0
Y4   0   1   1
sum  3   2   1
Run Code Online (Sandbox Code Playgroud)

并选择要使用的 30 列。但是,我只能得到行的总和,如下所示:

Y    X1  X3  X2  sum
Y1   1   1   0    2
Y2   1   0   0    1
Y3   1   0   0    1
Y4   0   1   1    2
Run Code Online (Sandbox Code Playgroud)

使用

pivot_table['sum'] = pivot_table.sum(axis=1)
Run Code Online (Sandbox Code Playgroud)

我也尝试过

pivot_table['sum'] = pivot_table.sum(axis=0)
Run Code Online (Sandbox Code Playgroud)

并尝试添加.transpose()但这不起作用。我还认为可能有比我正在做的逐步尝试更快的方法来做到这一点。

EdC*_*ica 5

您可以致电sumdf,这将返回一个 Series,然后您可以对该系列进行排序,然后使用该系列的索引来重新排序您的 df:

\n\n
In [249]:\n# note that column \'X3\' will produce a sum value of 2\nt="""Y    X1  X2  X3\nY1   1   0   1\nY2   1   0   1\nY3   1   0   0\nY4   0   1   0"""\n# load the data\ndf = pd.read_csv(io.StringIO(t), sep=\'\\s+\', index_col=[0])\ndf\n\nOut[249]:\n    X1  X2  X3\nY             \nY1   1   0   1\nY2   1   0   1\nY3   1   0   0\nY4   0   1   0\n
Run Code Online (Sandbox Code Playgroud)\n\n

结果sum将返回一系列我们想要对其进行排序并传递参数的序列,inplace=False以便它返回一个副本并ascending=False

\n\n
In [250]:\n# now calculate the sum, call sort on the series\ns = df.sum().sort(ascending=False, inplace=False)\ns\n\xe2\x80\x8b\nOut[250]:\nX1    3\nX3    2\nX2    1\ndtype: int64\n\nIn [251]:\n# now use fancy indexing to reorder the df\ndf.ix[:,s.index]\n\nOut[251]:\n    X1  X3  X2\nY             \nY1   1   1   0\nY2   1   1   0\nY3   1   0   0\nY4   0   0   1\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果您只想要顶部,您可以对索引进行切片n

\n\n
In [254]:\ndf = df[s.index[:2]]\ndf\n\nOut[254]:\n    X1  X3\nY         \nY1   1   1\nY2   1   1\nY3   1   0\nY4   0   0\n
Run Code Online (Sandbox Code Playgroud)\n