gpt4 book ai didi

python - 通过考虑各种特征(列)组合对数据框进行排名

转载 作者:行者123 更新时间:2023-12-04 15:18:53 26 4
gpt4 key购买 nike

我有一个 pandas 数据框,它有 4 列,看起来像

import plotly.express as px
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

data = pd.read_excel('disparity.xlsx')
data.head()

dataframe

然后我使用 plotly 绘制堆叠条形图。

px.bar(data.head().set_index('COUNTY'))

输出是 Stacked barchart

但我希望此堆叠条形图按降序或升序显示。此外,除了三列之外,我还想通过一次绘制两列来绘制排名堆叠条形图,即 (COVID 死亡,糖尿病)(COVID 死亡、肥胖)(肥胖、糖尿病)

因此,我实际上想绘制总共 4 个排名的堆叠条形图。请在这方面帮助我。

最佳答案

想法是计算每一行的排序依据键,将其作为新列添加到 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])

关于python - 通过考虑各种特征(列)组合对数据框进行排名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63798224/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com