2012-05-23 20 views
24

Birkaç sütunla birlikte bir DataFrame sahibim. Bir sütun, hangi para biriminin kullanıldığı bir sembolü içerir, örneğin bir euro veya dolar işareti. Başka bir sütun, bir bütçe değeri içerir. Örneğin, bir satırda, bu, 5000 avroluk bir bütçe anlamına gelebilir ve bir sonraki satırda, 2000 dolarlık bir bütçe söyleyebilirdi.Pandalarda başka bir sütun değerine bağlı olarak sütun değerlerini aralıklı olarak doldurun

Pandalarda, bütçeleri euro cinsinden normalleştirerek DataFrame'ime fazladan bir sütun eklemek istiyorum. Temel olarak, her satır için, yeni sütundaki değer, sütun sütunundaki sembol bir euro işaretiyse bütçe sütunundan * 1 olmalıdır ve yeni sütundaki değer, bütçe sütununun değeri olmalıdır * Para birimi sütunundaki sembol dolar işareti ise 0.78125.

Sütunu nasıl ekleyeceğimi biliyorum, değerlerle doldurun, değerleri başka bir sütundan vb. Kopyalayın, ancak yeni sütunu koşullu olarak başka bir sütunun değerine göre nasıl dolduracağınızı bilmiyorum.

herhangi bir öneriniz?

cevap

45

Muhtemelen daha sonra tek tek değerler/sütunları erişmek için row['fieldname'] sözdizimi kullanarak, bir satırda istediğiniz işlemi gerçekleştiren bir işlevi yazmak olabilir alternatif bir tarzda aracılığıyla

df['Normalized'] = np.where(df['Currency'] == '$', df['Budget'] * 0.78125, df['Budget']) 
+1

Bunun gibi bir şey yapmak mümkün mü, sayı yerine kelimelerle mi? –

1
: Bu

Bu burada bağlantılı sorunun cevabını yankıları üzerine DataFrame.apply yöntemi gerçekleştirmek

Tom Kimber'ın önerisini bir adım ileri götürdüğünde, işlevleriniz için çeşitli koşulları ayarlamak üzere bir İşlev Sözlüğü kullanabilirsiniz. Bu çözüm, sorunun kapsamını genişletiyor.

Kişisel bir uygulamadan örnek kullanıyorum.

# write the dictionary 

def applyCalculateSpend (df_name, cost_method_col, metric_col, rate_col, total_planned_col): 
    calculations = { 
      'CPMV' : df_name[metric_col]/1000 * df_name[rate_col], 
      'Free' : 0 
      } 
    df_method = df_name[cost_method_col] 
    return calculations.get(df_method, "not in dict") 

# call the function inside a lambda 

test_df['spend'] = test_df.apply(lambda row: applyCalculateSpend(
row, 
cost_method_col='cost method', 
metric_col='metric', 
rate_col='rate', 
total_planned_col='total planned'), axis = 1) 

    cost method metric rate total planned spend 
0  CPMV 2000 100   1000 200.0 
1  CPMV 4000 100   1000 400.0 
4  Free  1  2    3 0.0 
İlgili konular