[英]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.