はじめに
データ クリーニングは複雑で面倒な (kubi) タスクであり、データ分析プロセス全体の中で最も重要なリンクでもあります。分析プロジェクトの時間の 80% はデータのクリーニングに費やされるという人もいます。これは奇妙に聞こえますが、実際の作業ではこれが真実です。データ クリーニングの目的は 2 つあります。1 つ目は、クリーニングを通じてデータを利用できるようにすることです。 2 つ目は、データをその後の分析により適したものにすることです。言い換えれば、洗浄する必要がある「ダーティ」データと、同様に洗浄する必要があるクリーンなデータが存在します。
データ分析、特にテキスト分析では、文字処理に多くのエネルギーが必要となるため、文字処理を理解することもデータ分析にとって非常に重要な能力です。
文字列の処理方法
まずは基本的な方法を理解しましょう
まずは文字列の分割方法を理解しましょう
str='i like apple,i like bananer' print(str.split(','))
文字列をカンマで分割してください str 結果分割の結果:
['i like apple', 'i like bananer']
print(str.split(' '))
スペースに基づいて分割した結果:
['i', 'like', 'apple,i '、'いいね'、'バナナ']
print(str.index(',')) print(str.find(','))
両方の検索結果:
12
見つからない場合、index はエラーを返し、find は -1 を返します
print(str.count('i'))
結果は次のようになります:
4
connt はターゲット文字列の頻度をカウントするために使用されます
print(str.replace(',', ' ').split(' '))
結果は次のようになります:
['i', 'like', 'apple', ' i' , 'like', 'bananer']
ここで replace はカンマをスペースに置き換え、各単語を取り出すのに十分なだけのスペースを使用して文字列を分割します。
従来の方法に加えて、最も強力な文字処理ツールは正規表現です。
正規表現
正規表現を使用する前に、正規表現の多くのメソッドを理解する必要があります。
次のメソッドの使用法を見てみましょう。まず、match メソッドと search メソッドの違いを理解してください
str = "Cats are smarter than dogs" pattern=re.compile(r'(.*) are (.*?) .*') result=re.match(pattern,str) for i in range(len(result.groups())+1): print(result.group(i))
結果は次のようになります:
猫は犬より賢い
猫
賢い
これらの形式のパターンマッチングルールでは、一致メソッドと検索メソッドの戻り結果は同じです
このとき、パターンを
pattern=re.compile(r'are (.*?) .*')
に変更すると、一致は何も返されなくなり、検索リターンの結果は次のとおりです。上記は、番号を抽出するという目的を達成するために、# 記号の後の内容を空に置き換えることによって行われます。
数値のクロスバーをさらに置き換えることもできます
str = "138-9592-5592 # number" pattern=re.compile(r'#.*$') number=re.sub(pattern,'',str) print(number)
結果は次のようになります:
13895925592print(re.sub(r'-*','',number))
['5', '5', '5']
正規表現の全体的な内容は比較的大きいため、一致する文字列のルールを十分に理解する必要があります。以下に、具体的なマッチング ルールを示します。
ベクトル化された文字列関数
str = "138-9592-5592 # number" pattern=re.compile(r'5') print(pattern.findall(str))
結果は次のとおりです:
data = pd.Series({'li': '120@qq.com','wang':'5632@qq.com', 'chen': '8622@xinlang.com','zhao':np.nan,'sun':'5243@gmail.com'}) print(data)
結果は::
文字列を分割して必要な文字列を抽出することもできますprint(data.str.contains('@'))
结果为:
chen [(8622, xinlang, com)]
li [(120, qq, com)]
sun [(5243, gmail, com)]
wang [(5632, qq, com)]
zhao NaN
dtype: object
此时加入我们需要提取邮箱前面的名称
print(result.str.get(0))
结果为:
或者需要邮箱所属的域名
print(result.str.get(1))
结果为:
当然也可以用切片的方式进行提取,不过提取的数据准确性不高
data = pd.Series({'li': '120@qq.com','wang':'5632@qq.com', 'chen': '8622@xinlang.com','zhao':np.nan,'sun':'5243@gmail.com'}) print(data.str[:6])
结果为:
最后我们了解下矢量化的字符串方法
更多Pythonデータクリーニングシリーズの文字列処理を詳しく解説相关文章请关注PHP中文网!