2017-08-11 43 views
2

我需要根據不同列中的值是否包含某些字母和一些規則來填充列中的值。Python的數據框條件列人口

例如:

這是我的起始數據幀:

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

這是我的目標數據幀:

targetdf = [('A', ['3c', '20b', '9']), 
    ('B', ['Prod1', 'Prod2', 'Prod3']), 
    ('C', ['15.00', '40.00', '9']), 
    ] 
df2 = pd.DataFrame.from_items(targetdf) 
df2 

在上述我的例子中,如果在列A的單元格中包含的 'C' ,列C中的相應單元格應包含列A中單元格的數字部分與5的乘積結果。如果列A中的單元格包含'b',則相應的單元格將在列C應包含列A中單元的數字部分乘以2的結果。如果列A中的單元不包含字母(即,它是一個數字),將該數字複製到列C中相應的單元格。

我認爲解決方案將涉及使用「contains」來搜索'c'或'b'。也許是一個If語句?我不確定。我當然需要幫助提取A列中單元格的數字部分,並在C列中填充正確的值。我對Python很新穎。

謝謝你的幫助。

回答

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

This works great。謝謝 – 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