按列求和排序Pandas数据框。

17

我有一个像这样的数据框

            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_valuestail。 但是我不知道如何操作。


只是为了明确,列中的值不是一个累加和,对吧?那些是每个日期的单独值? - chitown88
取前两列或前两行? - Umar.H
那么对于大于4的值,就不需要进行测试了吗? - jezrael
5个回答

18

据我所知,您可以做到:

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

输出:

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

4

首先按照和大于4的条件进行筛选,然后使用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')

3
您可以沿着第一轴取数据框的sumsort_values并取前n列:
df[df.sum(0).sort_values(ascending=False)[:2].index]


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

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])
)

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接