我正在基于现有列中的值创建一个新列。如果现有列以“ abc”或“ def”开头,则将新列设置为“ x”。否则将其设置为“ y”。
检查应该不区分大小写。
我有类似这样的东西–
import pandas as pd
df = pd.DataFrame({'command': ['abc123', 'abcdef', 'hold',
'release', 'hold', 'abcxyz',
'kill', 'def123', 'hold'],
'name': ['fred', 'wilma', 'barney',
'fred', 'barney', 'betty',
'pebbles', 'dino', 'wilma'],
'date': ['2020-05', '2020-05', '2020-05',
'2020-06', '2020-06', '2020-06',
'2020-07', '2020-07', '2020-07']})
有印刷品-
command date name
0 abc123 2020-05 fred
1 abcdef 2020-05 wilma
2 hold 2020-05 barney
3 release 2020-06 fred
4 hold 2020-06 barney
5 abcxyz 2020-06 betty
6 kill 2020-07 pebbles
7 def123 2020-07 dino
8 hold 2020-07 wilma
我正在寻找类似这样的东西-
command date name status
0 abc123 2020-05 fred x
1 abcdef 2020-05 wilma x
2 hold 2020-05 barney y
3 CHG 2020-06 fred y
4 hold 2020-06 barney y
5 abcxyz 2020-06 betty x
6 kill 2020-07 pebbles y
7 def123 2020-07 dino x
8 hold 2020-07 wilma y
使用以下命令,如果值等于-
,我可以使工作正常def source(row):
if row['command'] == 'abcdef':
return 'x'
else:
return 'y'
# Apply the results from the above Function
df['source'] = df.apply(source, axis=1)
但是命令值可以是任何值,我无法对每种可能性进行硬编码搜索。
我不知道如何使用startswith使它正常工作。
答案 0 :(得分:2)
将Series.str.startswith
和np.where
用于条件列:
m = df['command'].str.startswith(('abc', 'def'))
df['status'] = np.where(m, 'x', 'y')
或者只是将前三个字符切成薄片并使用Series.isin
:
m = df['command'].str[:3]
m = m.isin(['abc', 'def'])
df['status'] = np.where(m, 'x', 'y')
command name date status
0 abc123 fred 2020-05 x
1 abcdef wilma 2020-05 x
2 hold barney 2020-05 y
3 release fred 2020-06 y
4 hold barney 2020-06 y
5 abcxyz betty 2020-06 x
6 kill pebbles 2020-07 y
7 def123 dino 2020-07 x
8 hold wilma 2020-07 y