我有一个df:
MinMaleTA
0 888(G2M)
1 888(AAM)
2 888(G2M)
3 888(G2M)
4 456
5 123
我想添加一个新列:
如果df['MinMaleTA']包含字符串“()”,则新列的值将是“()”中的字符串
如果df['MinMaleTA']不包含字符串“()”,则新列的值将为None
输出应如下所示:
MinMaleTA NewCol
0 888(G2M) G2M
1 888(AAM) AAM
2 888(G2M) G2M
3 888(G2M) G2M
4 456 None
5 123 None
我试过:
df['ScaleName']=np.where(df['MinMaleTA'].str.contains("(",regex=False),df['MinMaleTx'].str.extract(r'\((.*)\)'),None)
错误:
Wrong number of items passed 6, placement implies 1
我测试了:
df['MinMaleTA'].str.contains("(",regex=False)
输出为:
True
True
True
True
False
False
以及:
df['MinMaleTx'].str.extract(r'\((.*)\)')
输出为:
G2M
AAM
G2M
G2M
None
None
因此,它:
两者:
df['MinMaleTA'].str.contains("(",regex=False)
及
df['MinMaleTx'].str.extract(r'\((.*)\)')
工作,他们会做好自己的工作
但一旦我把它们结合在一起:
df['ScaleName']=np.where(df['MinMaleTA'].str.contains("(",regex=False),df['MinMaleTx'].str.extract(r'\((.*)\)'),None)
错误出现了:
Wrong number of items passed 6, placement implies 1
此错误与
str.extract
相关的广播规则有关运行
df['MinMaleTA'].str.extract(r'\((.*)\)')
时,不会得到pd.Series
,而是得到一个pd.DataFrame
,其列数从0到N个捕获组不等。由于您只有一个捕获组,因此如下所示:这意味着,当您创建
np.where
选择器时,它将为每一行传递整个数据帧。因此:这就是为什么您有6个条目而不是1个条目。为了解决这个问题,在
where
语句中,将.iloc[:, 0]
附加到str.extract
或者,根据Anurag Dabas在此合并的答案,将
expand=False
传递给str.extract
。由于您只捕获单个组,因此将返回np.where
期望的序列。因此:请注意,如果有多个捕获组,则这不起作用:
str.extract
在这种情况下返回数据帧相关问题 更多 >
编程相关推荐