Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 相加列并选择总和最大的列_Python_Sorting_Pandas_Sum_Dataframe - Fatal编程技术网

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

Python 相加列并选择总和最大的列,python,sorting,pandas,sum,dataframe,Python,Sorting,Pandas,Sum,Dataframe,我正在寻找排序的数据帧。我有这个数据框: Y X1 X2 X3 Y1 1 0 1 Y2 1 0 0 Y3 1 0 0 Y4 0 1 0 有很多专栏。如果向下添加列,我想选择总和最大的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 然后我会按总和行排序 Y

我正在寻找排序的数据帧。我有这个数据框:

Y    X1  X2  X3
Y1   1   0   1
Y2   1   0   0
Y3   1   0   0
Y4   0   1   0
有很多专栏。如果向下添加列,我想选择总和最大的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
然后我会按总和行排序

Y    X1  X3  X2
Y1   1   1   0
Y2   1   0   0
Y3   1   0   0
Y4   0   1   1
sum  3   2   1
然后选择要使用的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
使用

pivot_table['sum'] = pivot_table.sum(axis=1)
我也试过了

pivot_table['sum'] = pivot_table.sum(axis=0)

并尝试添加
.transpose()
,但此操作无效。我还认为,可能有一种比我现在一步一步的尝试更快的方法

您可以在df上调用
sum
,这将返回一个序列,然后您可以对该序列进行排序,然后使用序列的索引对df进行重新排序:

In [249]:
# note that column 'X3' will produce a sum value of 2
t="""Y    X1  X2  X3
Y1   1   0   1
Y2   1   0   1
Y3   1   0   0
Y4   0   1   0"""
# load the data
df = pd.read_csv(io.StringIO(t), sep='\s+', index_col=[0])
df

Out[249]:
    X1  X2  X3
Y             
Y1   1   0   1
Y2   1   0   1
Y3   1   0   0
Y4   0   1   0
来自
sum
的结果将返回一个系列,我们希望对其进行排序,并传递参数
inplace=False
,因此它将返回一个副本和
升序=False

In [250]:
# now calculate the sum, call sort on the series
s = df.sum().sort(ascending=False, inplace=False)
s
​
Out[250]:
X1    3
X3    2
X2    1
dtype: int64

In [251]:
# now use fancy indexing to reorder the df
df.ix[:,s.index]

Out[251]:
    X1  X3  X2
Y             
Y1   1   1   0
Y2   1   1   0
Y3   1   0   0
Y4   0   0   1
如果只需要顶部的
n
列,可以对索引进行切片:

In [254]:
df = df[s.index[:2]]
df

Out[254]:
    X1  X3
Y         
Y1   1   1
Y2   1   1
Y3   1   0
Y4   0   0
您可以在数据帧上使用descripe()来获取每列(包括总和)的统计信息。然后使用descripe result中的max sum列对数据帧进行排序


我想说,一般来说,在数据框架中添加语义不同于其他行的行不是一个好主意。它不是Excel。

我有一个类似的问题,我只想保持列的总和最大。以下是我的解决方案:

ncols是要保留多少列

def top_cols(dftemp,ncols):
    dfsum = dftemp.sum().to_frame().reset_index()
    dfsum = dfsum.sort_values(by=0,ascending=False, inplace=False).head(ncols)
    top_cols = dfsum['index'].tolist()
    return dftemp[top_cols]

df = top_cols(df,50) #this would return the dataframe with the 50 columns with the largest sums

很抱歉,您是在询问如何按列求和,然后对列进行排序,以便最高的值首先按列显示?是的,这就是我的意思。OP希望使用求和值对熊猫1.1.5的dfUpdate进行重新排序:对序列或数据帧进行排序使用
pd.DataFrame.sort\u值
。有关更多信息,请参阅。