按列总和排序熊猫数据框

时间:2020-03-19 13:53:04

标签: python pandas dataframe sorting

我有一个看起来像这样的数据框

            Australia  Austria    United Kingdom  Vietnam
date                                                    
2020-01-30          9        0                 1       2
2020-01-31          9        9                 4       2

我想创建一个新的数据框,其中包含列总和> 4的国家,然后我就这样做

df1 = df[[i for i in df.columns if int(df[i].sum()) > 4]]

这给了我

            Australia  Austria    United Kingdom  
date                                                     
2020-01-30          9        0                 1      
2020-01-31          9        9                 4 

我现在想基于列的总和对国家/地区进行排序,而不是采用前2个

            Australia  Austria   
date                                    
2020-01-30          9        0        
2020-01-31          9        9

我知道我必须使用 sort_values tail 。 我只是不能锻炼

5 个答案:

答案 0 :(得分:4)

首先对大于4的和进行过滤,然后对前2个和加Series.nlargest并按索引值进行过滤:

s = df.sum()

df = df[s[s > 4].nlargest(2).index]
print (df)
            Australia  Austria
date                          
2020-01-30          9        0
2020-01-31          9        9

详细信息

print (s)
Australia    18.0
Austria       9.0
United        5.0
Kingdom       4.0
Vietnam       0.0
dtype: float64

print (s[s > 4])
Australia    18.0
Austria       9.0
United        5.0
dtype: float64

print (s[s > 4].nlargest(2))
Australia    18.0
Austria       9.0
dtype: float64

print (s[s > 4].nlargest(2).index)
Index(['Australia', 'Austria'], dtype='object')

答案 1 :(得分:2)

IIUC,您可以这样做:

s = df.sum()
df[s.sort_values(ascending=False).index[:2]]

输出:

            Australia  Austria
date                          
2020-01-30          9        0
2020-01-31          9        9

答案 2 :(得分:1)

您可以沿第一个轴sum获取数据帧的sort_values,并获取前n列:

df[df.sum(0).sort_values(ascending=False)[:2].index]


               Australia  Austria
2020-01-30          9        0
2020-01-31          9        9

答案 3 :(得分:1)

另一种稍微修改列表的方法。

cols = df[[i for i in df.columns if int(df[i].sum()) > 4]].stack().groupby(level=1).sum().head(2).index

#would yield the same result df.stack().groupby(level=1).sum().head(2).index


df[cols]

            Australia  Austria
date                          
2020-01-30          9        0
2020-01-31          9        9

答案 4 :(得分:1)

您也可以使用 .pipe 函数内联执行此操作,如果您不想为临时结果定义变量,这会有所帮助:

df.pipe(lambda df: df.loc[:, df.sum().sort_values(ascending=False).index])

例如,您可能有一个管道:

new_df = (
    df1
    # Some example operations one might do:
    .groupby('column')
    .apply(sum).unstack()
    .fillna(0).astype(int)
    # Sort columns by total count:
    .pipe(lambda df: df.loc[:, df.sum().sort_values(ascending=False).index])
)