我有一个看起来像这样的数据框
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 。 我只是不能锻炼
答案 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])
)