【问题标题】:Loop for cleaning dataset (R)循环清洗数据集 (R)
【发布时间】:2023-03-22 13:06:01
【问题描述】:

我是一名在 NCAA 足球项目中工作的初学者数据科学家。我们在练习过程中记录重复测量数据,需要对其进行组织和分析。我有这个示例数据集,由于“活动”列中的变化/错别字,我无法分析。我需要一种方法来重命名/组织数据框中的活动。

原始数据集如下所示:

Position Activity Max_Velocity (mph)
WR Special Team 1 20
WR special team 1 19
WR Special team 1 18
WR special Team 2 13
WR ST 2 16
WR St 2 19
WR team 1 12
WR team 1 20
WR team 1 23
WR team 2 21
WR team 2 10
WR team 2 3
WR team 3 21
WR team 3 11
WR team 3 16
WR Indy 1 20
WR indy 2 21
WR INDY 3 22

我需要它看起来像这样:

Position Activity Max_Velocity (mph) Activity_Catagory
WR Special Team 1 20 Special Team
WR special team 1 19 Special Team
WR Special team 1 18 Special Team
WR special Team 2 13 Special Team
WR ST 2 16 Special Team
WR St 2 19 Special Team
WR team 1 12 Team
WR team 1 20 Team
WR team 1 23 Team
WR team 2 21 Team
WR team 2 10 Team
WR team 2 3 Team
WR team 3 21 Team
WR team 3 11 Team
WR team 3 16 Team
WR Indy 1 20 Indy
WR indy 2 21 Indy
WR INDY 3 22 Indy

这样我可以分析每种活动类型中因变量“Max_velocity”的平均值。我宁愿不制作单独的代码行来纠正“活动”列中的每个错字。我认为这可以通过循环来完成,但我是初学者,不知道从哪里开始。我将不胜感激任何帮助,使其成为一个简单的修复。

【问题讨论】:

  • 不应该是indy1 行有indy 而不是team??
  • 您需要创建一组规则。如果你有超过 1 个单词。然后取它们的初始值并将它们组合起来。特别队-> ST。您需要创建一个字典来映射单词。并且还使用正则表达式仅捕获单词(而不是数字)
  • 你能用代码证明吗?我不熟悉正则表达式
  • 检查我的答案。
  • 所以我需要创建一个字典来将“活动拼写错误”链接到我想要的输出。我不明白正则表达式。那是函数、库等吗?

标签: r list dataframe data-science


【解决方案1】:

试试:

在第一步中,我使用正则表达式在数字出现之前捕获文本。见:https://regex101.com/r/8xTxPl/1 然后我试图将单词的第一个字母大写。 最后是将短形式与完整形式进行映射。

actv = (df1.Activity.str.extract('([\w\s]+)\s\d', expand=False).str.title())
df1 = df1.assign(new_Actv = np.where(actv=='St', 'Special Team', actv))

df1:

Position Activity Max_Velocity (mph) new_Actv
0 WR Special Team 1 20 Special Team
1 WR special team 1 19 Special Team
2 WR Special team 1 18 Special Team
3 WR special Team 2 13 Special Team
4 WR ST 2 16 Special Team
5 WR St 2 19 Special Team
6 WR team 1 12 Team
7 WR team 1 20 Team
8 WR team 1 23 Team
9 WR team 2 21 Team
10 WR team 2 10 Team
11 WR team 2 3 Team
12 WR team 3 21 Team
13 WR team 3 11 Team
14 WR team 3 16 Team
15 WR Indy 1 20 Indy
16 WR indy 2 21 Indy
17 WR INDY 3 22 Indy

【讨论】:

  • 感谢您回答我的问题。你能扩展你使用的代码吗?
  • @MarkMamon:需要解释吗?
  • 是的,我想要一个冗长的详细解释。我是初学者,所以我需要对其进行彻底的解释。
  • @MarkMamon:正则表达式部分你可以从那个链接更好地解释它:) [\w\s]+ ==>捕获text containing words or space more than 1 times。所以它将捕获整个文本。现在我已经设置了限制。不!!我想要text before space followed by the digit。所以它会给你Special Team
【解决方案2】:

使用此解决方案,您可以使用任意关键字和自定义模式:

categ = (df.Activity.str.extract('(?P<SpecialTeam>special team|st)|(?P<Team>team)|(?P<Indy>indy)', flags=2)
                    .notnull()
        )
df['Activity_Category'] = categ[categ].stack().reset_index()['level_1']

这定义了regex with grouped names 形式的'(?P&lt;group1_name&gt;pattern1|pattern2|pattern3)|(?P&lt;group2_name&gt;pattern1|…)'

flags=2 等价于 flags=re.IGNORECASE 并且使匹配不区分大小写

你得到一个数据框categ,每组一列,真/假

    SpecialTeam   Team   Indy
0          True  False  False
1          True  False  False
…
6         False   True  False
…
17        False  False   True

然后将其堆叠以仅保留 True 值,即类别名称。

输出:

   Position         Activity  Max_Velocity (mph) Activity_Category
0       WR   Special Team 1                   20       SpecialTeam
1       WR   special team 1                   19       SpecialTeam
2       WR   Special team 1                   18       SpecialTeam
3       WR   special Team 2                   13       SpecialTeam
4       WR             ST 2                   16       SpecialTeam
5       WR             St 2                   19       SpecialTeam
6       WR           team 1                   12              Team
7       WR           team 1                   20              Team
8       WR           team 1                   23              Team
9       WR           team 2                   21              Team
10      WR           team 2                   10              Team
11      WR           team 2                    3              Team
12      WR           team 3                   21              Team
13      WR           team 3                   11              Team
14      WR           team 3                   16              Team
15      WR           Indy 1                   20              Indy
16      WR           indy 2                   21              Indy
17      WR           INDY 3                   22              Indy

一个限制是您不能在正则表达式组名称中使用空格,但如果您使用 CamelCase,您可以通过以下方式修复它:

df['Activity_Category'] = df.Activity_Category.apply(lambda s: re.sub('([a-z])([A-Z])','\g<1> \g<2>', s))

【讨论】:

  • 学到了一些新东西。高级正则表达式:OOO +1。从来没有想过堆栈可以用于这个问题:O
  • 嗯,老实说,我从来没有做过,现在才想到;)
猜你喜欢
  • 2021-09-10
  • 2021-02-04
  • 2022-12-09
  • 1970-01-01
  • 2014-05-23
  • 2014-08-29
  • 2021-02-04
  • 2019-03-15
  • 2021-11-21
相关资源
最近更新 更多