[ターン] Pythonデータ操作のための12のパンダテクニック(コード付き)

Pythonデータ操作のための12のパンダテクニック(コード付き)

 

Pythonは、近年、データサイエンスの分野で最も人気のある言語の1つになっています。重要な理由の1つは、Pythonには使いやすいパッケージとツールが多数あることです。これらのライブラリの中で、Pandasはデータサイエンス操作のための最も実用的なツールの1つです。この記事では、Pythonデータ操作のための12のPandasメソッドを共有し、作業効率を向上させるためのヒントと提案をいくつか追加します。

 

データセット:この記事では、AnalyticsVidhyaデータサイエンスコンテストの「ローン予測」問題で使用されたデータセットを使用します。

https://datahack.analyticsvidhya.com/contest/practice-problem-loan-prediction-iii/

 

まず、モジュールをインポートし、データセットをPython環境にロードします。

import pandas as pd
import numpy as np
data = pd.read_csv("train.csv", index_col="Loan_ID")

 

ブールインデックス

 

特定の条件に基づいて、列のセットから列の値を除外する場合はどうなりますか?たとえば、ローンを組んでまだ卒業していないすべての女性のリストを含むリストが必要です。ここでブールインデックスを使用すると役立つ場合があります。次のコードを使用できます。

data.loc[(data["Gender"]=="Female") & (data["Education"]=="Not Graduate") & (data["Loan_Status"]=="Y"), ["Gender","Education","Loan_Status"]]

 

 

機能を適用する

適用関数は、データを処理して新しい変数を作成するために一般的に使用される関数の1つです。DataFrameの行/列に関数を適用した後、Applyはいくつかの値を返します。この関数は、デフォルトを使用することも、カスタマイズすることもできます。たとえば、ここで使用して、各行と各列の欠落値を見つけることができます。

 

#创建一个新函数
def num_missing(x):
  return sum(x.isnull())

#应用每一列
print "Missing values per column:"
print data.apply(num_missing, axis=0) #axis=0 defines that function is to be applied on each column

#应用每一行
print "\nMissing values per row:"
print data.apply(num_missing, axis=1).head() #axis=1 defines that function is to be applied on each row

 

 

このようにして、望ましい結果が得られました。

 

注:2番目の出力には多くの行が含まれているため、head()関数を使用してください。

 

欠落している値を置き換える

 

fillna()を使用して、欠落している値を1つのステップで置き換えます。欠落している値をターゲット列の平均/モード/中央値で更新できます。次の例では、列「Gender」、「Married」、および「Self_Employed」のモードを使用して、欠落している値を置き換えます。

 

#首先我们导入一个函数来确定模式
from scipy.stats import mode
mode(data['Gender'])

 

出力:

ModeResult(mode=array([‘Male’], dtype=object), count=array([489]))

 

複数の高周波値が存在する可能性があるため、モードが配列である場合があることを忘れないでください。デフォルトでは、最初のものを使用します。

mode(data['Gender']).mode[0]

出力:

‘Male’

これで、不足している値を入力できます。上記の2番目の方法を使用して確認してください。

 

#导入值:
data['Gender'].fillna(mode(data['Gender']).mode[0], inplace=True)
data['Married'].fillna(mode(data['Married']).mode[0], inplace=True)
data['Self_Employed'].fillna(mode(data['Self_Employed']).mode[0], inplace=True)

#现在再次检查缺失值进行确认:
print data.apply(num_missing, axis=0)

 

 

欠落している値が置き換えられたことを確認します。これは単なる一般的な置換方法であり、欠落値のモデリングなど、他の複雑な方法があることに注意してください。

 

ピボットテーブル

パンダを使用して、Excelスタイルのピボットテーブルを作成することもできます。たとえば、この例では、データのキー列は「LoanAmount」であり、欠落している値が含まれています。欠落している値を、グループ「Gender」、「Married」、および「Self_Employed」の平均に置き換えることができます。このようにして、各グループの平均「LoanAmount」は次のように決定できます。

 

#确定数据透视表
impute_grps = data.pivot_table(values=["LoanAmount"], index=["Gender","Married","Self_Employed"], aggfunc=np.mean)
print impute_grps

 

 

複数のインデックス

 

3番目の手法の出力に注意を払うと、奇妙な機能があることがわかります。各インデックスは3つの値で構成されています。これは多重指数であり、操作速度を上げることができます。

 

上記の3番目の手法の例を続けると、各グループの値がありますが、欠落している値はまだ推定されていません。

この問題を解決するために、以前に使用した手法を使用できます。

 

#用缺失的 LoanAmount仅迭代所有的行
for i,row in data.loc[data['LoanAmount'].isnull(),:].iterrows():
  ind = tuple([row['Gender'],row['Married'],row['Self_Employed']])
  data.loc[i,'LoanAmount'] = impute_grps.loc[ind].values[0]

#现在再次检查缺失值进行确认
print data.apply(num_missing, axis=0)

 

 

注意:

マルチインデックスには、関数で使用されるタプルであるlocステートメントでインデックスグループを定義するためのタプルが必要です。

 

ここでの.values [0]サフィックスは、一連の要素がデフォルトで返されるために必要です。これにより、DataFrameと一致しないインデックスが生成されます。この例では、値を直接割り当てるとエラーが発生します。

 

クロス集計

 

この関数は、データの予備的な「感触」(概要)を取得するために使用されます。ここでは、基本的な仮定を検証できます。たとえば、この例では、「Credit_History」がローンのステータスに大きく影響することが予想されます。次に、以下に示すクロステーブルを使用してテストできます。

pd.crosstab(data["Credit_History"],data["Loan_Status"],margins=True)

 

 

これらは絶対値です。ただし、パーセンテージを使用する方が直感的です。適用関数を使用して、以下を完了することができます。

def percConvert(ser):
  return ser/float(ser[-1])
  pd.crosstab(data["Credit_History"],data["Loan_Status"],margins=True).apply(percConvert, axis=1)

 

 

現在、信用履歴のある人はローンを取得する可能性が高いことは明らかです。クレジットのない人の9%と比較して、80%です。

 

しかし、事実はそれほど単純ではありません。信用履歴を持つことは非常に重要であることがわかっているので、信用履歴のある人をY、信用履歴のない人をNとして借り入れ状況を予測するとどうなるでしょうか。614のテストすべてのうち、82 + 378 = 460の予測が正しく、正解率が75%に達したことに驚かれることでしょう。

 

なぜ統計モデルが必要なのか不思議に思うかもしれませんが、0.001%でも精度を上げることは非常に難しい課題であることを知っておく必要があります。

 

注:75%の正解率は、トレーニングセットで得られた正解率です。テストセットではわずかに異なりますが、類似しています。

 

DataFrameをマージします

 

チェックする必要のある複数のデータソースからの情報がある場合、DataFrameのマージが基本的な操作になります。異なるプロパティタイプの平均プロパティ価格(平方メートルあたりの価格)が異なるという架空の状況を考えてみます。DataFrameを次のように定義します。

 

prop_rates = pd.DataFrame([1000, 5000, 12000], index=['Rural','Semiurban','Urban'],columns=['rates'])
prop_rates

 

 

これで、この情報を最初のDataFrameとマージして次のようにすることができます。

data_merged = data.merge(right=prop_rates, how='inner',left_on='Property_Area',right_index=True, sort=False)
data_merged.pivot_table(values='Credit_History',index=['Property_Area','rates'], aggfunc=len)

 

 

ピボットテーブルから、マージが成功したことがわかります。'values'パラメータは、単に値を計算するだけなので、これとは関係がないことに注意してください。

 

DataFrameを並べ替える

 

Pandasを使用すると、複数の列で簡単に並べ替えることができます。これは次のように実行できます。

data_sorted = data.sort_values(['ApplicantIncome','CoapplicantIncome'], ascending=False)
data_sorted[['ApplicantIncome','CoapplicantIncome']].head(10)

 

 

注:Pandasの「並べ替え」機能は使用できなくなりました。代わりに「sort_values」を使用する必要があります。

 

プロット(箱ひげ図とヒストグラム)

 

多くの人は、箱ひげ図やヒストグラムをパンダに直接描画できることを知らないかもしれません。実際、matplotlibを呼び出す必要はありません。1行のコマンドのみが必要です。たとえば、Loan_Statusに基づいてローン申請者の所得分布を比較する場合は次のようになります。

import matplotlib.pyplot as plt
%matplotlib inline
data.boxplot(column="ApplicantIncome",by="Loan_Status")

 

data.hist(column="ApplicantIncome",by="Loan_Status",bins=30)

 

グラフからわかるように、融資を受けた人と拒否された人の収入に明らかな違いがないため、収入は大きな決定要因ではありません。

データの組み合わせにカット機能を使用

 

クラスタリング後、値がより意味のあるものになる場合があります。たとえば、1日(時間単位は分)のトラフィックフローを1時間ごと、1分ごとに正確にモデル化する必要があります。トラフィックフローを予測する場合、相関はそれほど高くない可能性があります。実際の期間を使用してください。 「朝」「午後」「夕方」「夜」「深夜」などの日が効果的です。この方法でトラフィックフローをモデル化すると、より直感的になり、過剰適合を回避できます。

 

ここでは、任意の変数を組み合わせるために再利用できる単純な関数を定義します。

 

#组合:
def binning(col, cut_points, labels=None):
  #定义最小和最大值
  minval = col.min()
  maxval = col.max()

  #向cut_points添加最大和最小值来创建列表
  break_points = [minval] + cut_points + [maxval]

  #如果没提供标签就用默认标签 0 ... (n-1)
  if not labels:
    labels = range(len(cut_points)+1)

  #用Pandas的cut函数进行组合
  colBin = pd.cut(col,bins=break_points,labels=labels,include_lowest=True)
  return colBin

#组合:
cut_points = [90,140,190]
labels = ["low","medium","high","very high"]
data["LoanAmount_Bin"] = binning(data["LoanAmount"], cut_points, labels)
print pd.value_counts(data["LoanAmount_Bin"], sort=False)

 

コードネームデータ

 

通常、名義変数のカテゴリを変更する必要がある状況が発生します。これにはいくつかの理由が考えられます。

 

一部のアルゴリズム(ロジスティック回帰など)では、すべての入力を数値にする必要があります。したがって、ほとんどの名目変数は0,1···(n-1)として記述されます。

 

カテゴリは2つの方法で表現できる場合があります。たとえば、温度は「高」、「中」、「低」、または「H」、「低」として記録できます。「高」と「H」はどちらも同じカテゴリを示します。同様に、「低」と「低」はわずかに異なります。ただし、Pythonはそれらを異なるレベルとして読み取ります。

 

一部のカテゴリは非常に低く表示される場合があるため、通常はそれらをマージすることをお勧めします。ここでは、入力が辞書の形式である一般的な関数を定義してから、Pandasの「replace」関数を使用して入力値をエンコードします。

 

#用Pandas的replace函数定义一个通用函数
def coding(col, codeDict):
  colCoded = pd.Series(col, copy=True)
  for key, value in codeDict.items():
    colCoded.replace(key, value, inplace=True)
  return colCoded
 
#将LoanStatus 编码为 Y=1, N=0:
print 'Before Coding:'
print pd.value_counts(data["Loan_Status"])
data["Loan_Status_Coded"] = coding(data["Loan_Status"], {'N':0,'Y':1})
print '\nAfter Coding:'
print pd.value_counts(data["Loan_Status_Coded"])

 

 

DadaFrameの行を繰り返します

 

このテクニックはあまり使われませんが、そのような問題に遭遇した場合でも、恐れることはありませんよね?場合によっては、forループを使用してすべての行を反復処理することがあります。たとえば、私たちが直面する一般的な問題は、Pythonの変数が正しく処理されないことです。通常、次の2つの状況で発生します。

 

  • 数値カテゴリの名義変数は数値変数として扱われます
  • 行に文字が含まれる数値変数(データエラーのため)がカテゴリ変数として扱われる場合

 

したがって、多くの場合、列のタイプを手動で定義する方が適切な方法です。すべての列のデータ型を確認すると、次のようになります。

 

#检查当前类型:
data.dtypes

 

 

ここでは、Credit_Historyが名目変数であることがわかりますが、浮動小数点値として表示されます。この問題を解決する良い方法は、列名とタイプを含むCSVファイルを作成することです。このようにして、ファイルを読み取り、列のデータ型を割り当てる一般的な関数を記述できます。たとえば、ここではCSVファイルdatatypes.csvを作成しました。

 

#加载文件:
colTypes = pd.read_csv('datatypes.csv')
print colTypes

 

 

ファイルを読み込んだ後、各行を繰り返し処理し、「type」列を使用して、「feature」列で定義された変数名にデータ型を割り当てることができます。

 

#迭代每一行,并分配变量类型
#注:astype 用来分配类型

for i, row in colTypes.iterrows():  #i: dataframe index; row: each row in series format
    if row['type']=="categorical":
        data[row['feature']]=data[row['feature']].astype(np.object)
    elif row['type']=="continuous":
        data[row['feature']]=data[row['feature']].astype(np.float)
print data.dtypes

 

 

このようにして、Credit_History列は「オブジェクト」タイプに変更されます。これは、パンダの名目変数を表すために使用できます。

 

結論

この記事では、Pandasを使用してデータを操作し、機能エンジニアリングを実行することをより便利で効率的にする、Pandasのいくつかの手法について説明しました。さらに、さまざまなデータセットで同じ効果を達成するために再利用できるいくつかの一般的な関数も定義しました。

おすすめ

転載: blog.csdn.net/weixin_52071682/article/details/112446816