问题
我无法弄清楚如何根据其他两列中的值创建新的 DataFrame 列。我需要使用 if/elif/else 逻辑。但是我发现的所有文档和示例都只显示了 if/else 逻辑。这是我正在尝试做的一个示例:
代码
df['combo'] = 'mobile' if (df['mobile'] == 'mobile') elif (df['tablet'] =='tablet') 'tablet' else 'other')
我也愿意使用 where() 。只是找不到正确的语法。
如果您有多个分支语句,最好创建一个接受行的函数,然后将其应用到axis=1
. 这通常比遍历行要快得多。
def func(row):
if row['mobile'] == 'mobile':
return 'mobile'
elif row['tablet'] =='tablet':
return 'tablet'
else:
return 'other'
df['combo'] = df.apply(func, axis=1)
我尝试了以下方法,结果要快得多。希望对其他人有帮助。
df['combo'] = 'other'
df.loc[df['mobile'] == 'mobile', 'combo'] = 'mobile'
df.loc[df['tablet'] == 'tablet', 'combo'] = 'tablet'
ELIF
逻辑可以用np.select
或嵌套实现np.where
:
import numpy as np
df['combo'] = np.select([df.mobile == 'mobile', df.tablet == 'tablet'],
['mobile', 'tablet'],
default='other')
# or
df['combo'] = np.where(df.mobile == 'mobile', 'mobile',
np.where(df.tablet == 'tablet', 'tablet', 'other'))
mobile tablet combo
0 mobile bar mobile
1 foo tablet tablet
2 foo nan other
3 mobile tablet mobile
4 mobile nan mobile
5 foo tablet tablet
6 mobile bar mobile
7 mobile tablet mobile
8 mobile bar mobile
9 mobile nan mobile
添加到 np.where 解决方案:
df['col1']= np.where(df['col'] < 3, 1,np.where( (df['col'] >3 )& (df['col'] <5),2,3))
整体逻辑是:
np.where(Condition, 'true block','false block').
每个真/假块可以依次再次嵌套。
另外,请注意&
forANDing! (not 'and')
添加以应用 lambda 解决方案:
df['combo'] = df.apply(lambda x: 'mobile' if x['mobile'] == 'mobile' else \
('tablet' if x[''mobile']== 'tablet' else 'other'), axis=1)
结构 :
df['column_name'] = df.apply(lambda x: 'value if true 1' if x['column_name_check_1'] == 'condition_1' else
('value if true 2' if x['column_name_check_2'] == 'condition_2' else
('value if true 3' if x['column_name_check_3'] == 'condition_3' else 'default_value')),axis=1)
注意:轴 1 用于格式值作为列/系列