我有一个数据帧(系列('df'
,如下所示:
Name
A1001
A1002
B1001
C1001
A1003
B1002
B1003
C1002
D1001
D1002
我想创建一个名为"公司"的新列,如果文本以'A'
开头,则应读取'Alpha'
,如果文本以'B'
开头,'Bravo'
如果文本以其他任何内容开头,则应读取'Others'
。
我试过了:
df['Company'] = 'Alpha' if df.Name.str.startswith('A') else 'Other'
但它给了我一个错误:
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
预期输出:
Name Company
A1001 Alpha
A1002 Alpha
B1001 Bravo
C1001 Other
A1003 Alpha
B1002 Bravo
B1003 Bravo
C1002 Other
D1001 Other
D1002 Other
怎么能做到呢?
将numpy.select
与Series.str.startswith
一起使用:
df['Company'] = np.select([df.Name.str.startswith('A'),
df.Name.str.startswith('B')],
['Alpha', 'Bravo'],
default='Other')
print (df)
Name Company
0 A1001 Alpha
1 A1002 Alpha
2 B1001 Bravo
3 C1001 Other
4 A1003 Alpha
5 B1002 Bravo
6 B1003 Bravo
7 C1002 Other
8 D1001 Other
9 D1002 Other
使用np.select
创建多条件列:
letter = df['Name'].str[0]
df['Company'] = np.select([letter.eq('A'), letter.eq('B')], ['Alpha', 'Bravo'], default='Other')
Name Company
0 A1001 Alpha
1 A1002 Alpha
2 B1001 Bravo
3 C1001 Other
4 A1003 Alpha
5 B1002 Bravo
6 B1003 Bravo
7 C1002 Other
8 D1001 Other
9 D1002 Other
相同的方法,但现在我们使用更"自我解释"的代码:
letter = df['Name'].str[0]
conditions = [letter.eq('A'), letter.eq('B')]
choices = ['Alpha', 'Bravo']
df['Company'] = np.select(conditions, choices, default='Other')