如何将范围字符串(箱)转换为可用于 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
可视化进一步探索,但是,数字数据已使用字符串值以年龄箱的形式收集。
有没有办法将这些列(Age
和 Approximate 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 箱线图
将分割图(点图)添加到分组箱线图 - Pandas 和 Seaborn