我正在寻找一种根据“色调”绘制带有堆叠条的计数图的有效方法。标准色调行为是根据第二列的值将计数拆分为平行条,我正在寻找的是一种将色调条堆叠以便快速比较总数的有效方法。
让我用一个来自泰坦尼克号数据集的例子来解释:
import pandas as pd
import numpy as np
import seaborn as sns
%matplotlib inline
df = sns.load_dataset('titanic')
sns.countplot(x='survived',hue='class',data=df)
Run Code Online (Sandbox Code Playgroud)
提供带有计数图和色调的标准 Seaborn 行为
我正在寻找的是类似于每个色调的堆叠条
为了获得最后一张图片,我使用了以下代码
def aggregate(rows,columns,df):
column_keys = df[columns].unique()
row_keys = df[rows].unique()
agg = { key : [ len(df[(df[rows]==value) & (df[columns]==key)]) for value in row_keys]
for key in column_keys }
aggdf = pd.DataFrame(agg,index = row_keys)
aggdf.index.rename(rows,inplace=True)
return aggdf
aggregate('survived','class',df).plot(kind='bar',stacked=True)
Run Code Online (Sandbox Code Playgroud)
我相信有一些更有效的方法。我知道 seaborn 对堆叠条形不太友好……所以我尝试用我的函数重新排列数据集并使用 matplotlib,但我想还有一种更聪明的方法可以做到这一点。
非常感谢!
我一直非常满意地使用 lightGBM 模型,因为我拥有包含数十个特征和数百万行的大型数据集,以及许多分类列。我非常喜欢 lightGBM 获得 pandas 数据帧的方式,该数据帧具有简单定义的分类特征,astype('category')
无需任何 one-hot 编码。我还有一些浮动列,我试图将其转换为分类箱,以加速收敛并强制确定决策点的边界。问题是尝试将浮动列装箱会pd.cut
导致 fit 方法失败并抛出ValueError: Circular reference detected
这里有一个类似的问题,实际上在回溯中提到了 Json 编码器,但我没有那里的答案所建议的 DateTime 列。我想 lightGBM 可能不支持 .cut 类别,但我在文档中找不到有关此的任何信息。
要复制这个问题,不需要大数据集,这里有一个玩具示例,我在其中构建了一个 100 行、10 列的数据集。5 列是整数,我用 astype 将其转换为分类 5 列是浮点数。将浮点数保持为浮点数一切正常,使用 pd.cut 将一个或多个浮点列转换为分类列会导致 fit 函数抛出错误。
import lightgbm as lgb
from sklearn.model_selection import train_test_split
rows = 100
fcols = 5
ccols = 5
# Let's define some ascii readable names for convenience
fnames = ['Float_'+str(chr(97+n)) for n in range(fcols)]
cnames = ['Cat_'+str(chr(97+n)) for n …
Run Code Online (Sandbox Code Playgroud)