簡體   English   中英

根據 A 列的值對 B 列的值應用操作 - Pandas

[英]Apply an operation on the value of column B depending on the value of column A - Pandas

我有以下數據集:

id  Wages   PayFreq
0   1013    Weekly
1   5000    Monthly
2   892     Weekly
3   2320    Bi-Weekly
4   1068    Weekly

我打算執行以下操作:

if PayFreq == 'Monthly':
   (Wages / 4) * 52
elif PayFreq == 'Bi-Weekly':
   (Wages / 2) * 52
else:
    Wages * 52

我需要 select 根據 PayFreq 列中存在的內容將操作應用於工資列。 有任何想法嗎?

按字典使用Series.map ,對於不匹配的值,請使用Series.fillna ,因為 map 返回NaN和按Wages列的倍數:

d = {'Monthly': 52/4, 'Bi-Weekly': 52/2}
df['YearWages'] = df['PayFreq'].map(d).fillna(52).mul(df['Wages'])

print (df)
   id  Wages    PayFreq  YearWages
0   0   1013     Weekly    52676.0
1   1   5000    Monthly    65000.0
2   2    892     Weekly    46384.0
3   3   2320  Bi-Weekly    60320.0
4   4   1068     Weekly    55536.0

將掩碼傳遞給numpy.select的解決方案:

df['NewWages'] = np.select([df['PayFreq'] == 'Weekly',
                            df['PayFreq']== ' Monthly'], 
                            [(df['Wages'] / 2)*52, 
                             (df['Wages'] / 4) * 52], default=df['Wages']*52)
                            
print (df)
   id  Wages    PayFreq  NewWages
0   0   1013     Weekly   26338.0
1   1   5000    Monthly  260000.0
2   2    892     Weekly   23192.0
3   3   2320  Bi-Weekly  120640.0
4   4   1068     Weekly   27768.0

或者您可以使用np.where並相應地調整條件,將以下僅用作示例而不是完整答案

import numpy as np
df['NewWages'] = np.where(df['PayFreq'] == 'Weekly', (df['Wages'] / 2)*52,
                          np.where(df['PayFreq']== ' Monthly', (df['Wages'] / 4) * 52, df['Wages']*52))

打印:

   id  Wages    PayFreq  NewWages
0   0   1013     Weekly   26338.0
1   1   5000    Monthly  260000.0
2   2    892     Weekly   23192.0
3   3   2320  Bi-Weekly  120640.0
4   4   1068     Weekly   27768.0

我建議使用 Dataframe 的apply ,因為它非常簡單直觀。

您可以定義要在 dataframe 上應用的方法,您可以為此選擇 Lambda 表達式或顯式 function。 例如,下面是一個簡單的實現,使用 function:

def func(row):
    if row['PayFreq'] == 'Monthly':
        return (row['Wages'] / 4) * 52
    elif row['PayFreq'] == 'Bi-Weekly':
        return (row['Wages'] / 2) * 52
    else:
        return row['Wages'] * 52

為了將其應用於您的 dataframe(在右軸上):

df['NewWages'] = df.apply(func, axis=1)

結果:

   Wages    PayFreq  NewWages
0   1013     Weekly   52676.0
1   5000    Monthly   65000.0
2    892     Weekly   46384.0
3   2320  Bi-Weekly   60320.0
4   1068     Weekly   55536.0

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM