标准化分类值
Posted
技术标签:
【中文标题】标准化分类值【英文标题】:standardize categorical value 【发布时间】:2021-04-04 16:55:39 【问题描述】:现在我正在处理开放数据集,其中一项任务是“标准化”值。我们只关心“年龄”、“性别”、“种族”、“种族”和“国家”属性。
对于“国家”,我们可以将“美国”、“美国”、“美国”作为匹配“美国”的有效表达式。还有很多其他国家在不同的数据集中有不同的表达值。
目标是将所有这些值“转换”为例如“US”。但是,我不知道其他数据集中是否存在“US”的其他表达方式。所有数据集的存储容量为 2.3 TB。我无法迭代所有数据集以获取“US”的所有不同表达式,然后再次迭代以转换所有值。
有什么工具可以检测和转换这些东西吗?
现在一切都在 Python 之下。
最好的
最大
【问题讨论】:
嘿 Max,欢迎来到 SO,如果您向我们展示Gender
上的数据看起来如何,效果会更好...请添加输入和预期输出。总而言之,也许您可以通过结合使用 lower 和 replace 等来解决您的问题。
@DaniMesejo 我编辑了我的表达,如果不够清楚,我可能会做一个图表来解释目的。我想要解决的只是替换,但问题是我没有每个值的所有唯一表达式,例如,我不知道“US”将如何在不同的数据集中表示,所以我可能会错过一些简单的值降低并更换。我很难判断这个值是否是 'US' 的有效表达式。
如果你只能迭代一次,那么你需要一个函数来判断一个名字是否等同于'US'。如果是,那么您可以即时更换它。
@IsmaelELATIFI 所以看来我必须至少迭代一次。感谢您的帮助。
【参考方案1】:
“标准化”值的唯一方法是知道要匹配和替换什么,这涉及“循环”数据以找出存在的值。一旦你有了这个列表,你就可以设计合适的匹配字符串来替换。
因此,在这里,我们可以“循环”通过数据框(即,使用为我们执行循环和计数的函数)并计算列中的值。一旦我们有了该计数表,我们就可以复制并粘贴哪些值似乎与我们的国家名称相匹配。您可以手动完成此部分,因为此时它比自动化更容易。此步骤的一个重要部分是将值小写(使用.str.lower()
),以便您可以更好地比较和计算您的字符串。
>>> df = pd.DataFrame('Country': ['united-states', 'usa', 'USA', 'UNITED STATES',
'united states', 'us', 'us', 'us'])
>>> df
Country
0 united-states
1 usa
2 USA
3 UNITED STATES
4 united states
5 us
6 us
7 us
>>> df['Country'].value_counts()
us 3
united states 1
usa 1
united-states 1
UNITED STATES 1
USA 1
Name: Country, dtype: int64
>>> # Take a look at values above to generate replace list
>>> df['Country'].str.lower().replace(['united-states', 'usa', 'united states'], 'us')
0 us
1 us
2 us
3 us
4 us
5 us
6 us
7 us
Name: Country, dtype: object
在此处阅读更多信息https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.replace.html
上述解决方案仅适用于Country
列,但对于您数据的任何其他列都可能无效。这很乏味,但是这种数据整理必须手动完成,否则,您可能会丢失应该标准化的数据。而且,如果您最初未能抓住其中一些价值,则需要投入更多时间来修复那些缺失的价值。
如果您的数据碰巧定期发生变化,情况就会发生变化。在这种情况下,上述将是一个很好的第一种方法。但是您应该能够将fuzzy matching 之类的技术与fuzzywuzzy
之类的Python 包一起使用。这将允许您找出哪些字符串更相似,然后以这种方式解析它。但是,这需要更详细的工作。
【讨论】:
以上是关于标准化分类值的主要内容,如果未能解决你的问题,请参考以下文章
Python计算医疗数据训练集测试集的对应的临床特征:训练集(测试集)的阴性和阳性的样本个数连续变量的均值(标准差)以及训练测试集阳性阴性的p值离散变量的分类统计比率训练测试集阳性阴性的p值