Python:根据if语句条件填充新的df列

时间:2019-08-30 09:12:41

标签: python python-3.x pandas if-statement

我正在尝试新的东西。我想根据一些影响值的条件填充新的df列。

我有一个包含两列(ID,零售商)的数据框。我想根据ID列中的ID填充“零售商”列。我知道如何使用CASE语句在SQL中执行此操作,但是如何在python中执行此操作?

我看过这个例子,但这并不是我想要的。

Python : populate a new column with an if/else statement

import pandas as pd

data = {'ID':['112','5898','32','9985','23','577','17','200','156']}

df = pd.DataFrame(data)

df['Retailer']=''

if df['ID'] in (112,32):
    df['Retailer']='Webmania'
elif df['ID'] in (5898):
    df['Retailer']='DataHub'
elif df['ID'] in (9985):
    df['Retailer']='TorrentJunkie'
elif df['ID'] in (23):
    df['Retailer']='Apptronix'
else: df['Retailer']='Other'


print(df)

我希望看到的输出符合以下内容:

     ID Retailer
0   112 Webmania
1  5898 DataHub
2    32 Webmania
3  9985 TorrentJunkie
4    23 Apptronix
5   577 Other
6    17 Other
7   200 Other
8   156 Other

1 个答案:

答案 0 :(得分:1)

使用numpy.select,要测试多个值,请使用Series.isin,如果需要测试字符串(如样本数据),请将数字更改为从112'112'的数字:

m1 = df['ID'].isin(['112','32'])
m2 =  df['ID'] == '5898'
m3 =  df['ID'] == '9985'
m4 =  df['ID'] == '23'
vals = ['Webmania', 'DataHub', 'TorrentJunkie', 'Apptronix']
masks = [m1, m2, m3, m4]

df['Retailer'] = np.select(masks, vals, default='Other')
print(df)

     ID       Retailer
0   112       Webmania
1  5898        DataHub
2    32       Webmania
3  9985  TorrentJunkie
4    23      Apptronix
5   577          Other
6    17          Other
7   200          Other
8   156          Other

如果也可以使用许多分类,请使用具有自定义功能的解决方案:

def get_data(x):
    if x in ('112','32'):
        return 'Webmania'
    elif x == '5898':
        return 'DataHub'
    elif x == '9985':
        return 'TorrentJunkie'
    elif x == '23':
        return 'Apptronix'
    else: return 'Other'


df['Retailer'] =  df['ID'].apply(get_data)
print (df)
     ID       Retailer
0   112       Webmania
1  5898        DataHub
2    32       Webmania
3  9985  TorrentJunkie
4    23      Apptronix
5   577          Other
6    17          Other
7   200          Other
8   156          Other

或者按字典使用map,如果没有匹配项则得到NaN,因此添加了fillna

d = {'112': 'Webmania','32':'Webmania',
    '5898':'DataHub',
    '9985':'TorrentJunkie',
    '23':'Apptronix'}

df['Retailer'] =  df['ID'].map(d).fillna('Other')