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

Posted

技术标签:

【中文标题】通过考虑各种特征组合(列)对数据框进行排名【英文标题】:Ranking of dataframe by considering various combination of features(columns) 【发布时间】:2020-12-27 02:15:50 【问题描述】:

我有一个熊猫数据框,它有 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()

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

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

输出是

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

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

【问题讨论】:

what 您到底想对“我希望这个堆叠的条形图以降序或升序显示”中的条形图进行排序?按总高度? 是的。根据高度,即三列之和。 【参考方案1】:

试试这个:

for column_name, column_series in df.iloc[:, 1:].iteritems():
    fig = px.bar(df, x='COUNTY', y=column_name)
    fig.show()

【讨论】:

它给出了每列的图。但我想通过一次取两列来堆叠条形图,并且应该对堆叠条形图进行排序。 那你想要的和上面贴的有什么区别呢?【参考方案2】:

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

【讨论】:

非常感谢。 @Anakhand

以上是关于通过考虑各种特征组合(列)对数据框进行排名的主要内容,如果未能解决你的问题,请参考以下文章

在 SQL Server 中使用 Dense_Rank 对具有排名的列进行排名组合

使用来自不同列的值通过数据源填充组合框

如何通过对某些列进行分组来重塑数据框

Python pandas 通过对现有列进行分组来创建其他数据框列

通过对不同列使用不同聚合的 pandas 数据框进行分组

如何组合两个数据框并自然地对混合字母数字类型的列进行排序?