这个想法是计算每行的排序依据,将其作为新列添加到 DataFrame,然后使用DataFrame.sort_values 进行排序。 (不幸的是,现在没有简单的方法可以通过外部系列对数据框进行排序而不将其添加为列。)
首先,让我们永久设置索引,并保存原始特征列表:
data.set_index('COUNTY', inplace=True)
original_features = list(data.columns)
要按总高度排序,首先在数据框中添加一个额外的列,其中包含每行的总和
data["Total"] = data.sum(axis='columns')
并按此排序(但从图中删除“总计”列):
px.bar(data.sort_values("Total", ascending=True)[original_features])
您可以使用ascending 参数控制升序/降序。
再举一个例子,按“COVID 死亡”+“糖尿病”排序:
data["COVID + Diabetic"] = data["COVID Death"] + data["Diabetic"]
px.bar(data.sort_values("COVID + Diabetic", ascending=True)[original_features])
由于您提到要按每对列的总和进行排序,您可以使用循环自动执行该操作:
import itertools
for x, y in itertools.combinations(original_features, 2):
name = f"{x} + {y}"
data[name] = data[x] + data[y]
px.bar(data.sort_values(by=name, ascending=True)[original_features])
实际上,您可以将其推广到任意数量的功能;即,如果您想要为每个特征子集的总和绘制一个图(即每个特征、每一对等,直到总数),您可以这样做:
import operator
from functools import reduce
for k in range(1, len(original_features) + 1):
for comb in itertools.combinations(original_features, k):
name = " + ".join(comb)
data[name] = reduce(operator.add, (data[col] for col in comb))
# optional: reorder the columns so that the ones we're sorting by come first
order = list(comb) + [col for col in original_features if col not in comb]
px.bar(data.sort_values(by=name, ascending=True)[order])