我有一个这样的数据框
Index A
0 1 cat
1 2 dog
2 3 bot
3 4 fly
我想根据列A是否包含字母“ a OR b OR c”来创建两列
预期结果:
Index| A | yes | no |
--------------------------
1 |cat| cat | |
2 |dog| | dog |
3 |bot| bot | |
4 |fly| | fly |
此刻我有
abc = ['a', 'b', 'c']
abc = '|'.join(abc)
df['yes'] = df[df['A'].str.contains(abc)]['A']
df['no'] = df[df['A'].str.contains(abc) == False]['A']
该选择可以很好地工作,但是可以,但是如果没有,则会发生以下错误
ValueError: too many values to unpack (expected 3)
该列已创建,但由于错误,将来的功能(例如info())似乎因此中断。
这可能是因为对a,b和c给出了3个结果。有没有一种方法可以在这种情况下正确返回False值?谢谢
答案 0 :(得分:2)
这看起来像是set_index
和unstack
的工作:
m = df['A'].str.contains(abc).replace({True: 'yes', False: 'no'})
m
0 yes
1 no
2 yes
3 no
Name: A, dtype: object
df.set_index(['Index', m])['A'].unstack(fill_value='')
A no yes
Index
1 cat
2 dog
3 bot
4 fly
答案 1 :(得分:1)
使用您的方法,对代码进行少量更改即可获得正确的输出。
abc = ['a', 'b', 'c']
abc = '|'.join(abc)
df['yes'] = df[df['A'].str.contains(abc)]['A']
df['no'] = df[~df['A'].str.contains(abc)]['A']
答案 2 :(得分:0)
另一种方式;
将链np.where
,str.contains
和''.join()
填充为是和否。
pivot
框架如下
df['status']=np.where(df.A.str.contains('|'.join(['a','b','c'])),'yes','no')
df.pivot(index='A', columns='status',values='A').fillna('').reset_index()
status A no yes
0 bot bot
1 cat cat
2 dog dog
3 fly fly