Pandas - Fixing Wrong Data

داده اشتباه

داده اشتباه لازم نیست حتماً سلول خالی یا داده با فرمت اشتباه باشد، خیلی ساده فقط اشتباه است! مثلاً نفری که داده‌ها را وارد کرده ممکن است به جای 1.99 مقدار 199 را وارد کرده باشد.

بعضی اوقات با نگاه کردن به داده می‌توان داده اشتباه را تشخیص داد، زیرا تقریباً می‌دانیم باید انتظار چه مقداری را داشته باشیم.

اگر به مجموعه داده خودمان نگاه کنیم، مشاهده می‌کنیم که در سطر 7ام مقدار مدت زمان 450 وارد شده است در حالیکه در همه سطرهای دیگر این مقدار بین 30 تا 60 است.

شاید در ابتدا دلیلی برای اشتباه بودن آن نداشته باشیم ولی اگر این را در نظر بگیریم که این مدت زمان مربوط به زمان تمرین یک نفر است، به راحتی به این نتیجه می‌رسیم که آن نفر 450 دقیقه تمرین نکرده است.

جایگزین کردن مقدار اشتباه

یکی از راه‌های درست کردن مقدار اشتباه جایگزین کردن آن است.

در مثال ما به احتمال زیاد اشتباه تایپی رخ داده است و عدد مورد نظر 45 است. بنابراین مقدار 45 را در سطر 7ام به صورت زیر جایگزین می‌کنیم.

df.loc[7, 'Duration'] = 45

شاید برای مجموعه داده‌های کوچک بتوانید که مقادیر اشتباه را پیدا کرده و یکی یکی آن‌ها را جایگزین کنید، ولی برای مجموعه داده‌های بزرگ این کار غیر ممکن است.

در مجموعه داده‌های بزرگ معمولاً یک سری قانون درست می‌کنیم، مثلاً محدوده‌ای برای مقادیر مجاز قرار می‌دهیم و هر مقداری که خارج از محدوده مورد نظر بود را جایگزین می‌کنیم.

برای نمونه در کد زیر با استفاده از حلقه همه مقادیر ستون Duration را بررسی می‌کنیم و در صورتی که مقدار بررسی شده بزرگ‌تر از 120 باشد، آن را با 120 جایگزین می‌کنیم.


import pandas as pd

df = pd.read_csv('data.csv')

for x in df.index:
    if df.loc[x, "Duration"] > 120:
        df.loc[x, "Duration"] = 120

print(df.to_string())


    Duration          Date  Pulse  Maxpulse  Calories
0         60  '2020/12/01'    110       130     409.1
1         60  '2020/12/02'    117       145     479.0
2         60  '2020/12/03'    103       135     340.0
3         45  '2020/12/04'    109       175     282.4
4         45  '2020/12/05'    117       148     406.0
5         60  '2020/12/06'    102       127     300.0
6         60  '2020/12/07'    110       136     374.0
7        120  '2020/12/08'    104       134     253.3
8         30  '2020/12/09'    109       133     195.1
9         60  '2020/12/10'     98       124     269.0
10        60  '2020/12/11'    103       147     329.3
11        60  '2020/12/12'    100       120     250.7
12        60  '2020/12/12'    100       120     250.7
13        60  '2020/12/13'    106       128     345.3
14        60  '2020/12/14'    104       132     379.3
15        60  '2020/12/15'     98       123     275.0
16        60  '2020/12/16'     98       120     215.2
17        60  '2020/12/17'    100       120     300.0
18        45  '2020/12/18'     90       112       NaN
19        60  '2020/12/19'    103       123     323.0
20        45  '2020/12/20'     97       125     243.0
21        60  '2020/12/21'    108       131     364.2
22        45           NaN    100       119     282.0
23        60  '2020/12/23'    130       101     300.0
24        45  '2020/12/24'    105       132     246.0
25        60  '2020/12/25'    102       126     334.5
26        60      20201226    100       120     250.0
27        60  '2020/12/27'     92       118     241.0
28        60  '2020/12/28'    103       132       NaN
29        60  '2020/12/29'    100       132     280.0
30        60  '2020/12/30'    102       129     380.3
31        60  '2020/12/31'     92       115     243.0

حذف سطرها

یکی دیگر از راه‌کارهای برخورد با داده‌های اشتباه حذف سطر مربوط به آن‌ها است.

از این طریق دیگر نیازی به دانستن اینکه آن‌ها را با چه مقداری جایگزین کنید ندارید.


import pandas as pd

df = pd.read_csv('data.csv')

for x in df.index:
  if df.loc[x, "Duration"] > 120:
    df.drop(x, inplace = True)

#remember to include the 'inplace = True' argument to make
the changes in the original DataFrame object instead of returning a copy

print(df.to_string())



    Duration          Date  Pulse  Maxpulse  Calories
0         60  '2020/12/01'    110       130     409.1
1         60  '2020/12/02'    117       145     479.0
2         60  '2020/12/03'    103       135     340.0
3         45  '2020/12/04'    109       175     282.4
4         45  '2020/12/05'    117       148     406.0
5         60  '2020/12/06'    102       127     300.0
6         60  '2020/12/07'    110       136     374.0
8         30  '2020/12/09'    109       133     195.1
9         60  '2020/12/10'     98       124     269.0
10        60  '2020/12/11'    103       147     329.3
11        60  '2020/12/12'    100       120     250.7
12        60  '2020/12/12'    100       120     250.7
13        60  '2020/12/13'    106       128     345.3
14        60  '2020/12/14'    104       132     379.3
15        60  '2020/12/15'     98       123     275.0
16        60  '2020/12/16'     98       120     215.2
17        60  '2020/12/17'    100       120     300.0
18        45  '2020/12/18'     90       112       NaN
19        60  '2020/12/19'    103       123     323.0
20        45  '2020/12/20'     97       125     243.0
21        60  '2020/12/21'    108       131     364.2
22        45           NaN    100       119     282.0
23        60  '2020/12/23'    130       101     300.0
24        45  '2020/12/24'    105       132     246.0
25        60  '2020/12/25'    102       126     334.5
26        60      20201226    100       120     250.0
27        60  '2020/12/27'     92       118     241.0
28        60  '2020/12/28'    103       132       NaN
29        60  '2020/12/29'    100       132     280.0
30        60  '2020/12/30'    102       129     380.3
31        60  '2020/12/31'     92       115     243.0