簡體   English   中英

循環清洗數據集 (R)

[英]Loop for cleaning dataset (R)

我是一名在 NCAA 橄欖球項目中工作的初級數據科學家。 我們在實踐中記錄重復測量數據,需要組織然后分析。 我有這個示例數據集,由於“活動”列中的變化/錯別字,我在分析時遇到了麻煩。 我需要一種方法來重命名/組織數據框中的活動。

原始數據集如下所示:

位置 活動 最大速度(英里/小時)
寫字樓 特別小組 1 20
寫字樓 特別小組1 19
寫字樓 特別小組1 18
寫字樓 特別小組2 13
寫字樓 ST 2 16
寫字樓 聖 2 19
寫字樓 1隊 12
寫字樓 1隊 20
寫字樓 1隊 23
寫字樓 團隊 2 21
寫字樓 團隊 2 10
寫字樓 團隊 2 3
寫字樓 3隊 21
寫字樓 3隊 11
寫字樓 3隊 16
寫字樓 印地 1 20
寫字樓 印地 2 21
寫字樓 印地3 22

我需要它看起來像這樣:

位置 活動 最大速度(英里/小時) 活動_類別
寫字樓 特別小組 1 20 特別小組
寫字樓 特別小組1 19 特別小組
寫字樓 特別小組1 18 特別小組
寫字樓 特別小組2 13 特別小組
寫字樓 ST 2 16 特別小組
寫字樓 聖 2 19 特別小組
寫字樓 1隊 12 團隊
寫字樓 1隊 20 團隊
寫字樓 1隊 23 團隊
寫字樓 團隊 2 21 團隊
寫字樓 團隊 2 10 團隊
寫字樓 團隊 2 3 團隊
寫字樓 3隊 21 團隊
寫字樓 3隊 11 團隊
寫字樓 3隊 16 團隊
寫字樓 印地 1 20 印地
寫字樓 印地 2 21 印地
寫字樓 印地3 22 印地

通過這種方式,我可以在每種類型的活動中分析因變量“Max_velocity”的平均值。 我寧願不制作單獨的代碼行來糾正“活動”列中的每個錯字。 我認為這可以用循環來完成,但我是初學者,不知道從哪里開始。 我將不勝感激任何幫助使其成為一個簡單的修復。

嘗試:

第一步,我使用正則表達式在數字出現之前捕獲文本。 請參閱: 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:

位置 活動 最大速度(英里/小時) 新活動
0 寫字樓 特別小組 1 20 特別小組
1 寫字樓 特別小組1 19 特別小組
2 寫字樓 特別小組1 18 特別小組
3 寫字樓 特別小組2 13 特別小組
4 寫字樓 ST 2 16 特別小組
5 寫字樓 聖 2 19 特別小組
6 寫字樓 1隊 12 團隊
7 寫字樓 1隊 20 團隊
8 寫字樓 1隊 23 團隊
9 寫字樓 團隊 2 21 團隊
10 寫字樓 團隊 2 10 團隊
11 寫字樓 團隊 2 3 團隊
12 寫字樓 3隊 21 團隊
13 寫字樓 3隊 11 團隊
14 寫字樓 3隊 16 團隊
15 寫字樓 印地 1 20 印地
16 寫字樓 印地 2 21 印地
17 寫字樓 印地3 22 印地

使用此解決方案,您可以使用任意關鍵字和自定義模式:

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']

這定義了一個正則表達式,其分組名稱的形式為'(?P<group1_name>pattern1|pattern2|pattern3)|(?P<group2_name>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))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM