2017-08-17 20 views
2

私は約2000行の複数列dfを持っています。 はDF次のようになります。異なる列と異なる行の値を照合して新しい列を作成するpython pandas

site  le_cell le_id ca ca_id 
1 101  1011  1 NAN NAN 
2 101  1012  2 NAN NAN 
3 101  1013  3 NAN NAN 
4 110  1101  1  2  11 
5 110  1102  2  2  12 
6 110  1103  3  2  13 
7 110  1104  11 2  1 
8 110  1105  12 2  2 
9 110  1106  13 2  3 

は、ここで問題です。 'part_id'という名前の新しい列を作成する必要があります。 Groupby 'site'、 'ca'(ca = NAN)がない場合、 'part_id'はle_id(part_id = le_id)と等しくなります。 'ca'がある場合、 'ca_id'と 'part_id'の値が1,2,3.1となる。1と11 = 1,2,12 = 2,3と13 = 3。 希望出力:

site  le_cell le_id ca ca_id part_id 
1 101  1011  1 NAN NAN  1 
2 101  1012  2 NAN NAN  2 
3 101  1013  3 NAN NAN  3 
4 110  1101  1  2  11  1 
5 110  1102  2  2  12  2 
6 110  1103  3  2  13  3 
7 110  1104  11 2  1  1 
8 110  1105  12 2  2  2 
9 110  1106  13 2  3  3 

le_idの値を11,12,13から1,2,3に変換することはできません。だから私は 'ca'を通って 'le_cell'と同じ ' le_id 'を' ca_id 'として追加します。

私はdictに変換しようとしましたが、それはうまくいかないでしょう、どのように起動するのか分かりません。 少なくとも、私にいくつかのヒントを与えてください。

答えて

1

あなたはマッパーを定義し、あなたの条件に基づいて値を代入しますlambdaapplyを使用することができます。

mapper = {1: 1, 
      11: 1, 
      2: 2, 
      12: 2, 
      3: 3, 
      13: 3} 

df['part_id'] = df.apply(lambda row: row.le_id if np.isnan(row.ca) else mapper[row.ca_id], axis=1) 

    ca ca_id le_cell le_id site part_id 
0 NaN NaN  1011  1 101  1.0 
1 NaN NaN  1012  2 101  2.0 
2 NaN NaN  1013  3 101  3.0 
3 2.0 11.0  1101  1 110  1.0 
4 2.0 12.0  1102  2 110  2.0 
5 2.0 13.0  1103  3 110  3.0 
6 2.0 1.0  1104  11 110  1.0 
7 2.0 2.0  1105  12 110  2.0 
8 2.0 3.0  1106  13 110  3.0 

あなたはfloatを気にしませんが、こちらの場合は変換があります:

df['part_id'] = df['part_id'].astype(int) 
+0

@jezraelこのソリューションは、データ例とルールをベースにしています:) OPの例がすべての「ナノ」ケースをカバーするならば、これはうまくいくはずです – zipa

1

は、私はあなたがboolean型のマスクを作成し、numpy.whereによって、列に値を追加することができると思う:

#if need check if all values per group are NaN 
a = df['ca'].isnull().groupby(df['site']).all() 
m = df['site'].isin(a.index[a]) 

#if need check if column ca is NaN 
#m= df['ca'].isnull() 

d = {11:1,12:2,13:3} 
df['part_id'] = np.where(m, df['le_id'], df['ca_id'].replace(d)) 
print (df) 
    site le_cell le_id ca ca_id part_id 
1 101  1011  1 NaN  0  1 
2 101  1012  2 NaN  0  2 
3 101  1013  3 NaN  0  3 
4 110  1101  1 2.0  11  1 
5 110  1102  2 2.0  12  2 
6 110  1103  3 2.0  13  3 
7 110  1104  11 2.0  1  1 
8 110  1105  12 2.0  2  2 
9 110  1106  13 2.0  3  3 
関連する問題