首页 > 解决方案 > pandas 传递错误的项目数 6,位置暗示 1

问题描述

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

标签: pythonpandasdataframenumpy

解决方案


此错误与str.extract.

当你运行时df['MinMaleTA'].str.extract(r'\((.*)\)'),你不会得到 a pd.Series,你得到的 apd.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=Falsestr.extract. 由于您只捕获一个组,这将返回np.where预期的系列。因此:

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

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


推荐阅读