Pandas通过的项目数量错误6,放置意味着1

2024-04-19 15:08:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个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

Tags: 字符串nonefalsetruedfnpextractregex
1条回答
网友
1楼 · 发布于 2024-04-19 15:08:19

此错误与str.extract相关的广播规则有关

运行df['MinMaleTA'].str.extract(r'\((.*)\)')时,不会得到pd.Series,而是得到一个pd.DataFrame,其列数从0到N个捕获组不等。由于您只有一个捕获组,因此如下所示:

     0
0  G2M
1  AAM
2  G2M
3  G2M
4  NaN
5  NaN

这意味着,当您创建np.where选择器时,它将为每一行传递整个数据帧。因此:

>>> np.where(df['MinMaleTA'].str.contains("(",regex=False),
             df['MinMaleTA'].str.extract(r'\((.*)\)'), np.nan)
array([['G2M', 'G2M', 'G2M', 'G2M', nan, nan],
       ['AAM', 'AAM', 'AAM', 'AAM', nan, nan],
       ['G2M', 'G2M', 'G2M', 'G2M', nan, nan],
       ['G2M', 'G2M', 'G2M', 'G2M', nan, nan],
       [nan, nan, nan, nan, nan, nan],
       [nan, nan, nan, nan, nan, nan]], dtype=object)
# Nb I substituted `np.nan` for `None`

这就是为什么您有6个条目而不是1个条目。为了解决这个问题,在where语句中,将.iloc[:, 0]附加到str.extract


或者,根据Anurag Dabas在此合并的答案,将expand=False传递给str.extract。由于您只捕获单个组,因此将返回np.where期望的序列。因此:

df['ScaleName']=np.where(
    df['MinMaleTA'].str.contains("(",regex=False),
    df['MinMaleTA'].str.extract(r'\((.*)\)',expand=False),
    None)

请注意,如果有多个捕获组,则这不起作用:str.extract在这种情况下返回数据帧

相关问题 更多 >