2017-08-11 5 views
2

異なる列の値に特定のアルファベットといくつかの規則が含まれているかどうかに基づいて、列に値を設定する必要があります。例えばPythonデータフレーム条件付き列の集まり

は:

上記の私の例では
targetdf = [('A', ['3c', '20b', '9']), 
    ('B', ['Prod1', 'Prod2', 'Prod3']), 
    ('C', ['15.00', '40.00', '9']), 
    ] 
df2 = pd.DataFrame.from_items(targetdf) 
df2 

は、A列のセルは、 'C' を含んでいる場合:

import pandas as pd 
testdata1 = [('A', ['3c', '20b', '9']), 
    ('B', ['Prod1', 'Prod2', 'Prod3']), 
    ('C', ['', '', '']), 
    ] 
df = pd.DataFrame.from_items(testdata1) 
df 

はここに私のターゲットデータフレームです:

は、ここに私の出発データフレームです列Cの対応するセルに列Aのセルの番号部分を5で乗算した結果が含まれているはずです。列Aのセルに「b」が含まれている場合、列Cには、列Aのセルの番号部分を2で乗算した結果が含まれている必要があります。列Aのセルにアルファベットが含まれていない場合(つまり、それは列Cの対応するセルに番号をコピーします。

解決策には、「含む」を使用して「c」または「b」を検索することが考えられます。たぶんIf文?私はわかりません。私は確かに列Aのセルの数値部分を抽出し、列Cの正しい値を入力するのに役立つ必要があります。私はかなり新しいです。

ありがとうございました。

答えて

3

これは動作するはずです:

def parse_data(x): 
    if 'c' in x: 
     num = int(x.split('c')[0]) 
     return num * 5 
    elif 'b' in x: 
     num = int(x.split('b')[0]) 
     return num * 2 
    else: 
     return x 

df['C'] = df['A'].apply(lambda x: parse_data(x)) 

    A  B C 
0 3c Prod1 15 
1 20b Prod2 40 
2 9 Prod3 9 
+0

ありがとうございます。よく働く。 – Jdoe

2

が、私はそれをこのようにしてください:

In [17]: mapping={'c':' * 5', 'b':' * 2'} 

In [18]: df['C'] = pd.eval(df.A.replace(mapping, regex=True)) 

In [19]: df 
Out[19]: 
    A  B C 
0 3c Prod1 15 
1 20b Prod2 40 
2 9 Prod3 9 

説明:

In [20]: df.A.replace(mapping, regex=True) 
Out[20]: 
0  3 * 5 
1 20 * 2 
2   9 
Name: A, dtype: object 
+0

私はこの解決策も好きで、簡潔で効果的です。+1 –

+0

@aws_apprentice、ありがとう:) – MaxU

+0

これは素晴らしいです。ありがとう – Jdoe

0

私は

のような正規表現と検索を使用したいです
In [538]: (df.A.str.extract('(\d+)(\w+)?', expand=True) 
      .replace({1: {'c':5,'b':2,np.nan:1}}).astype(int) 
      .prod(1)) 
Out[538]: 
0 15 
1 40 
2  9 
dtype: int32 

In [539]: df['C'] = (df.A.str.extract('(\d+)(\w+)?', expand=True) 
         .replace({1: {'c':5,'b':2,np.nan:1}}).astype(int) 
         .prod(1)) 
In [540]: df 
Out[540]: 
    A  B C 
0 3c Prod1 15 
1 20b Prod2 40 
2 9 Prod3 9 

詳細

In [542]: df.A.str.extract('(\d+)(\w+)?', expand=True) 
Out[542]: 
    0 1 
0 3 c 
1 20 b 
2 9 NaN 

In [543]: df.A.str.extract('(\d+)(\w+)?', expand=True).replace({1: {'c':5,'b':2,np.nan:1}}) 
Out[543]: 
    0 1 
0 3 5 
1 20 2 
2 9 1 
+0

これも動作します。助けてくれてありがとう。あなたのコードは私にとって非常に先進的です。この特定のアプローチの利点を説明できますか? – Jdoe

関連する問題