1. ホーム
  2. python

[解決済み] pandas が他の列の値に基づいて新しい列を作成する / 複数の列の関数を行単位で適用する

2022-03-19 19:24:20

質問

カスタム関数(if-else ラダーを使用)をこれらの6つのカラムに適用したい ( ERI_Hispanic , ERI_AmerInd_AKNatv , ERI_Asian , ERI_Black_Afr.Amer , ERI_HI_PacIsl , ERI_White ) を、データフレームの各行で使用することができます。

他の質問でいろいろな方法を試してみましたが、やはり私の問題に対する正しい答えが見つからないようです。 この問題で重要なのは、もしその人がヒスパニックとしてカウントされているならば、他のものとしてカウントされることはないということです。 他の民族の欄に "1" があったとしても、2つ以上の人種ではなく、ヒスパニックとしてカウントされるのです。 同様に、すべてのERI列の合計が1より大きい場合、彼らは2つ以上の人種としてカウントされ、固有の民族(ヒスパニックを除く)としてカウントされることはありません。 これでご理解いただけると思います。 どんな助けでも大いに感謝します。

各行でforループを行い、各レコードが基準を満たした場合、1つのリストに追加され、元のリストからは除外されるようなものです。

以下のデータフレームから、SQLで以下の仕様に基づいた新しいカラムを計算する必要があります。

========================= CRITERIA ===============================

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フラグが真(1)の場合、その従業員は "ヒスパニック "として分類される。

コメント 非ヒスパニック系のERIフラグが1つ以上真である場合、"Two or More "を返す。

データフレーム ======================================================================================================================== 12

     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

解決方法は?

まず、あなたが望む翻訳を行う関数を書くことです。あなたの疑似コードに基づいて例をまとめてみました。

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オブジェクトで、quot;row"とラベル付けされていることに注意してください。

次に、pandasのapply関数を使って、関数を適用します。

df.apply (lambda row: label_race(row), 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 (lambda row: label_race(row), 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