データ科学者の作業をクリーニングに費やされる時間の80%?
4つの重要なポイントの要約データクレンジングルール:「完全な統一」
- 整合性:NULL値がある場合、単一のデータは、統計的なフィールドは完璧です。
- 総合:我々はいずれかを選択し、このようなExcelシートのようにカラムについて観察されたすべての値は、カラムは、平均、最大値、最小値ことがわかります。データ定義、ユニット識別、値自体:我々のような、問題の列かどうかを決定するために常識を使用することができます。
- 正当性:データ、コンテンツやサイズの種類の正当性。例えば、非ASCII文字データ、性別不明の存在なので、上の150以上の歳と年齢の存在。
- 一意性:データは通常、異なるソースから集約されているので、重複データレコードかどうか、繰り返しの状況が一般的です。行、列、データのニーズは一意であることが、そのような人は、何度も記録を繰り返すことはできませんし、人の体重は、レコードの列指標で何回も繰り返すことはできません。
1整合性
質問1:欠損値
いくつかの年齢、体重値は、これらの値は、通常、3つの方法で、収集されていない、不足しています:
- 削除:欠落しているデータレコードを削除します。
- 手段:現在の列の平均値を使用して
- 周波数:最新の周波数データ列を使用して発生しました
DFは、[「年齢」]の平均年齢によって欠損値を埋めたいです:
df['Age'].fillna(df['Age'].mean(), inplace=True)
最高周波数のデータで満たされた、フィールドがvalue_countsを通じて年齢age_maxf最大周波数を得ることができ、その後、欠落したデータAgeフィールドはage_maxfで満たされています。
age_maxf = train_features['Age'].value_counts().index[0]
train_features['Age'].fillna(age_maxf, inplace=True)
質問2:空白行
Dropnaは、データを()処理を読み取られた後に、空白行を削除する必要
# 删除全空的行
df.dropna(how='all',inplace=True)
2つの包括
問題:単位列データが均一ではありません
測定単位として使用キロポンドキロポンドキログラムに変換します
# 获取 weight 数据列中单位为 lbs 的数据
rows_with_lbs = df['weight'].str.contains('lbs').fillna(False)
print df[rows_with_lbs]
# 将 lbs转换为 kgs, 2.2lbs=1kgs
for i,lbs_row in df[rows_with_lbs].iterrows():
# 截取从头开始到倒数第三个字符之前,即去掉lbs。
weight = int(float(lbs_row['weight'][:-3])/2.2)
df.at[i,'weight'] = '{}kgs'.format(weight)
3合理性
問題:非ASCII文字
非ASCIIの問題を解決するために削除するか、別の方法
# 删除非 ASCII 字符
df['first_name'].replace({r'[^\x00-\x7F]+':''}, regex=True, inplace=True)
df['last_name'].replace({r'[^\x00-\x7F]+':''}, regex=True, inplace=True)
4つの一意性
質問1:パラメータの数があります。
列名(名前)ファーストネーム&姓二つのパラメータ、2つのフィールドに名前欄ファーストネーム&姓の分割、splitメソッドを使用し、str.split(=真を拡大)、リストには新しい列に分割され、元[名前]列を削除
# 切分名字,删除源数据列
df[['first_name','last_name']] = df['name'].str.split(expand=True)
df.drop('name', axis=1, inplace=True)
質問2:重複データ
重複データを削除するdrop_duplicatesの使用()の重複レコードがあります。
# 删除重复数据行
df.drop_duplicates(['first_name','last_name'],inplace=True)
演習:
清掃珍味:
食物 | オンス | 動物 |
---|---|---|
ベーコン | 4.0 | 豚 |
プルドポーク | 3.0 | 豚 |
ベーコン | NaNの | 豚 |
パストラミ | 6.0 | 牛 |
コーンビーフ | 7.5 | 牛 |
ベーコン | 8.0 | 豚 |
パストラミ | -3.0 | 牛 |
ハチミツハム | 5.0 | 豚 |
新星のlox | 6.0 | サーモン |
import pandas as pd
"""利用Pandas清洗美食数据"""
# 读取csv文件
df = pd.read_csv("c.csv")
df['food'] = df['food'].str.lower() # 统一为小写字母
df.dropna(inplace=True) # 删除数据缺失的记录
df['ounces'] = df['ounces'].apply(lambda a: abs(a)) # 负值不合法,取绝对值
# 查找food重复的记录,分组求其平均值
d_rows = df[df['food'].duplicated(keep=False)]
g_items = d_rows.groupby('food').mean()
g_items['food'] = g_items.index
print(g_items)
# 遍历将重复food的平均值赋值给df
for i, row in g_items.iterrows():
df.loc[df.food == row.food, 'ounces'] = row.ounces
df.drop_duplicates(inplace=True) # 删除重复记录
df.index = range(len(df)) # 重设索引值
print(df)
若しくは
jupyter notebook,python3
import pandas as pd
df = pd.read_csv(r"D://Data_for_sci/food.csv")
df.index
df
# Data cleaning for lowercase
df['food'] = df['food'].str.lower()
df
# Delet NaN
df = df.dropna()
df.index = range(len(df)) # reset index
df
# Get bacon's mean value and delet second one
df.loc[0,'ounces'] = df[df['food'].isin(['bacon'])].mean()['ounces']
df.drop(df.index[4],inplace=True)
df.index = range(len(df)) # reset index
df
#Get pastrami's mean value and delet second one
df.loc[2,'ounces'] = df[df['food'].isin(['pastrami'])].mean()['ounces']
df.drop(df.index[4],inplace=True)
df.index = range(len(df)) # reset index
df