如何将范围字符串(箱)转换为可用于 Seaborn 可视化的数值

Posted

技术标签:

【中文标题】如何将范围字符串(箱)转换为可用于 Seaborn 可视化的数值【英文标题】:How to convert string of range (bins), into numerical values that can then be used with Seaborn visualisations 【发布时间】:2021-08-09 13:45:03 【问题描述】:

所以,我正在 Jupyter Notebooks 中使用 Python 3.7。我目前正在探索从.CSV file 导入的Pandas 形式的一些调查数据。我想通过一些Seaborn 可视化进一步探索,但是,数字数据已使用字符串值以年龄箱的形式收集。

有没有办法将这些列(AgeApproximate Household Income)转换为数值,然后可以与 Seaborn 一起使用?我尝试过搜索,但我的措辞似乎只是返回为具有数值的列创建年龄箱的方法。我真的在寻找如何将字符串值转换为数字年龄 bin 值。

另外,有人对我如何改进我的搜索方法有一些建议吗?寻找此类解决方案的理想措辞是什么?

这是来自数据框的示例,使用 df.head(5).to_dict(),出于匿名目的更改了值。

 'Age': 0: '45-54', 1: '35-44', 2: '45-54', 3: '45-54', 4: '55-64',
 'Ethnicity': 0: 'White', 1: 'White', 2: 'White', 3: 'White', 4: 'White',
 'Approximate Household Income': 0: '$175,000 - $199,999',
  1: '$75,000 - $99,999',
  2: '$25,000 - $49,999',
  3: '$50,000 - $74,999',
  4: nan,
 'Highest Level of Education Completed': 0: 'Four Year College Degree',
  1: 'Four Year College Degree',
  2: 'Jr College/Associates Degree',
  3: 'Jr College/Associates Degree',
  4: 'Four Year College Degree',
 '2020 Candidate Choice': 0: 'Joe Biden',
  1: 'Joe Biden',
  2: 'Donald Trump',
  3: 'Joe Biden',
  4: 'Donald Trump',
 '2016 Candidate Choice': 0: 'Hillary Clinton',
  1: 'Third Party',
  2: 'Donald Trump',
  3: 'Hillary Clinton',
  4: 'Third Party',
 'Party Registration 2020': 0: 'Independent',
  1: 'No Party',
  2: 'No Party',
  3: 'Independent',
  4: 'Independent',
 'Registered State for Voting': 0: 'Colorado',
  1: 'Virginia',
  2: 'California',
  3: 'North Carolina',
  4: 'Oregon'

【问题讨论】:

您不能将范围转换为具有最小和最大整数值 2 的列表,然后用它来绘制吗? 【参考方案1】:

您可以使用一些 pandas Series.str 方法。

较小的示例数据集:

import pandas as pd
import numpy as np

df = pd.DataFrame(
    
        "Age": 0: "45-54", 1: "35-44", 2: "45-54", 3: "45-54", 4: "55-64",
        "Ethnicity": 0: "White", 1: "White", 2: "White", 3: "White", 4: "White",
        "Approximate Household Income": 
            0: "$175,000 - $199,999",
            1: "$75,000 - $99,999",
            2: "$25,000 - $49,999",
            3: "$50,000 - $74,999",
            4: np.nan,
        ,
    
)
#      Age Ethnicity Approximate Household Income
# 0  45-54     White          $175,000 - $199,999
# 1  35-44     White            $75,000 - $99,999
# 2  45-54     White            $25,000 - $49,999
# 3  45-54     White            $50,000 - $74,999
# 4  55-64     White                          NaN

我们可以遍历列列表并链式应用这些方法来解析pandas.DataFrame中的所有范围:

我们将按顺序使用的方法:

Series.str.replace - 用空替换逗号 Series.str.extract - 从系列中提取数字,regex explained here Series.astype - 将提取的数字转换为floats DataFrame.rename - 重命名新列 DataFrame.join - 将提取的数字添加回原始数据帧
for col in ["Age", "Approximate Household Income"]:
    df = df.join(
        df[col]
        .str.replace(",", "", regex=False)
        .str.extract(pat=r"^[$]*(\d+)[-\s$]*(\d+)$")
        .astype("float")
        .rename(0: f"col_lower", 1: f"col_upper", axis="columns")
    )
#      Age Ethnicity Approximate Household Income  Age_lower  Age_upper  \
# 0  45-54     White          $175,000 - $199,999       45.0       54.0   
# 1  35-44     White            $75,000 - $99,999       35.0       44.0   
# 2  45-54     White            $25,000 - $49,999       45.0       54.0   
# 3  45-54     White            $50,000 - $74,999       45.0       54.0   
# 4  55-64     White                          NaN       55.0       64.0   
# 
#    Approximate Household Income_lower  Approximate Household Income_upper  
# 0                            175000.0                            199999.0  
# 1                             75000.0                             99999.0  
# 2                             25000.0                             49999.0  
# 3                             50000.0                             74999.0  
# 4                                 NaN                                 NaN  

【讨论】:

【参考方案2】:

在这种情况下,我建议根据字符串的格式为每种类型的类别“手动”设置转换。例如,对于年龄分类:

age = 0: '45-54', 1: '35-44', 2: '45-54', 3: '45-54', 4: '55-64'
age_bins = key: [int(age[key].split('-')[0]), int(age[key].split('-')[1])] for key in age
0: [45, 54], 1: [35, 44], 2: [45, 54], 3: [45, 54], 4: [55, 64]

【讨论】:

以上是关于如何将范围字符串(箱)转换为可用于 Seaborn 可视化的数值的主要内容,如果未能解决你的问题,请参考以下文章

基于 DataFrame 列名的颜色 seaborn 箱线图

使用色调和不同比例轴的 Seaborn(时间序列)箱线图

将分割图(点图)添加到分组箱线图 - Pandas 和 Seaborn

如何在 Seaborn 箱线图中编辑胡须、传单、帽子等的属性

如何绘制每个月和年的 seaborn 箱线图

Python统计分析可视化库seaborn(相关性图,变量分布图,箱线图等等)