データフレームの各行の 6 つの列( ERI_Hispanic
、、、、、、)にカスタム関数 ( ERI_AmerInd_AKNatv
if ERI_Asian
- elseERI_Black_Afr.Amer
ラダーを使用) を適用します。ERI_HI_PacIsl
ERI_White
他の質問とは異なる方法を試してみましたが、まだ自分の問題に対する正しい答えが見つからないようです。これの重要な部分は、人がヒスパニックとしてカウントされると、他の何としてもカウントできないということです。別の民族の列に「1」があっても、2 つ以上の人種ではなく、ヒスパニックとしてカウントされます。同様に、すべての ERI 列の合計が 1 より大きい場合、2 つ以上の人種としてカウントされ、固有の民族としてカウントすることはできません (ヒスパニックを除く)。
これは、各行に対して for ループを実行し、各レコードが基準を満たす場合は 1 つのリストに追加され、元のリストから削除されるようなものです。
以下のデータフレームから、SQL の次の仕様に基づいて新しい列を計算する必要があります。
基準
IF [ERI_Hispanic] = 1 THEN RETURN “Hispanic”
ELSE IF SUM([ERI_AmerInd_AKNatv] + [ERI_Asian] + [ERI_Black_Afr.Amer] + [ERI_HI_PacIsl] + [ERI_White]) > 1 THEN RETURN “Two or More”
ELSE IF [ERI_AmerInd_AKNatv] = 1 THEN RETURN “A/I AK Native”
ELSE IF [ERI_Asian] = 1 THEN RETURN “Asian”
ELSE IF [ERI_Black_Afr.Amer] = 1 THEN RETURN “Black/AA”
ELSE IF [ERI_HI_PacIsl] = 1 THEN RETURN “Haw/Pac Isl.”
ELSE IF [ERI_White] = 1 THEN RETURN “White”
コメント: ヒスパニックのERIフラグがTrue (1)の場合、従業員は「ヒスパニック」に分類されます。
コメント: 非ヒスパニック系ERIフラグが1つ以上当てはまる場合は、「2つ以上」を返します。
データフレーム
lname fname rno_cd eri_afr_amer eri_asian eri_hawaiian eri_hispanic eri_nat_amer eri_white rno_defined
0 MOST JEFF E 0 0 0 0 0 1 White
1 CRUISE TOM E 0 0 0 1 0 0 White
2 DEPP JOHNNY 0 0 0 0 0 1 Unknown
3 DICAP LEO 0 0 0 0 0 1 Unknown
4 BRANDO MARLON E 0 0 0 0 0 0 White
5 HANKS TOM 0 0 0 0 0 1 Unknown
6 DENIRO ROBERT E 0 1 0 0 0 1 White
7 PACINO AL E 0 0 0 0 0 1 White
8 WILLIAMS ROBIN E 0 0 1 0 0 0 White
9 EASTWOOD CLINT E 0 0 0 0 0 1 White
ベストアンサー1
さて、これには 2 つのステップがあります。まず、必要な翻訳を実行する関数を作成します。疑似コードに基づいて例をまとめました。
def label_race(row):
if row['eri_hispanic'] == 1:
return 'Hispanic'
if row['eri_afr_amer'] + row['eri_asian'] + row['eri_hawaiian'] + row['eri_nat_amer'] + row['eri_white'] > 1:
return 'Two Or More'
if row['eri_nat_amer'] == 1:
return 'A/I AK Native'
if row['eri_asian'] == 1:
return 'Asian'
if row['eri_afr_amer'] == 1:
return 'Black/AA'
if row['eri_hawaiian'] == 1:
return 'Haw/Pac Isl.'
if row['eri_white'] == 1:
return 'White'
return 'Other'
これを確認してみたいと思うかもしれませんが、うまくいくようです。関数に渡されるパラメータは、「行」というラベルの付いた Series オブジェクトであるとみなされることに注意してください。
次に、pandasのapply関数を使用して関数を適用します。例:
df.apply(label_race, axis=1)
指定子に注意してくださいaxis=1
。これは、アプリケーションが列レベルではなく行レベルで実行されることを意味します。結果は次のとおりです。
0 White
1 Hispanic
2 White
3 White
4 Other
5 White
6 Two Or More
7 White
8 Haw/Pac Isl.
9 White
結果に満足したら、もう一度実行して、結果を元のデータフレームの新しい列に保存します。
df['race_label'] = df.apply(label_race, axis=1)
結果のデータフレームは次のようになります (新しい列を表示するには右にスクロールします)。
lname fname rno_cd eri_afr_amer eri_asian eri_hawaiian eri_hispanic eri_nat_amer eri_white rno_defined race_label
0 MOST JEFF E 0 0 0 0 0 1 White White
1 CRUISE TOM E 0 0 0 1 0 0 White Hispanic
2 DEPP JOHNNY NaN 0 0 0 0 0 1 Unknown White
3 DICAP LEO NaN 0 0 0 0 0 1 Unknown White
4 BRANDO MARLON E 0 0 0 0 0 0 White Other
5 HANKS TOM NaN 0 0 0 0 0 1 Unknown White
6 DENIRO ROBERT E 0 1 0 0 0 1 White Two Or More
7 PACINO AL E 0 0 0 0 0 1 White White
8 WILLIAMS ROBIN E 0 0 1 0 0 0 White Haw/Pac Isl.
9 EASTWOOD CLINT E 0 0 0 0 0 1 White White