是否可以使用str.extract提取熊猫中的所有行?

时间:2019-03-06 06:51:53

标签: python pandas

这是我的数据框。

    ID
0   A01G
1   A43B
2   A45C
3   A61B
4   B01J
5   B08B

并且我尝试使用此代码提取它们

df.iloc[0, 1:2].str.extractall('(.)(.{2})(.*)')

得到了这个结果

    0   1   2

ID  A   01  G

但是我想提取所有行,然后将代码编辑为此

df.iloc[:, 1:2].str.extract('(.)(.{2})(.*)')

查看所有行都提取为我的预期结果

        0   1   2

ID      A   01  G
        A   43  B
        A   45  C
        A   61  B
        B   01  J
        B   08  B

但是此df.iloc[:, 1:2].str.extract('(.)(.{2})(.*)')无法正常工作,并且还执行了错误

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-44-ef9138002e22> in <module>()
----> 1 df_new.iloc[:, 1:2].str.extractall('(.)(.{2})(.*)')

~/anaconda3/lib/python3.6/site-packages/pandas/core/generic.py in __getattr__(self, name)
   4370             if self._info_axis._can_hold_identifiers_and_holds_name(name):
   4371                 return self[name]
-> 4372             return object.__getattribute__(self, name)
   4373 
   4374     def __setattr__(self, name, value):

AttributeError: 'DataFrame' object has no attribute 'str'

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

您仅需要通过1进行选择才能从第二列返回Series,因为DataFrame并未实现Series.str.extract

df.iloc[:, 1].str.extract('(.)(.{2})(.*)')

或按系列的列名称选择:

df['ID'].str.extract('(.)(.{2})(.*)')

如果使用:

df.iloc[:, 1:2]

它返回一列DataFrame,所以会引发错误。

示例

print (df)
   col    ID
0   10  A01G
1   10  A43B
2   10  A45C
3   10  A61B
4   10  B01J
5   10  B08B

print (df.iloc[:, 1])
0    A01G
1    A43B
2    A45C
3    A61B
4    B01J
5    B08B
Name: ID, dtype: object

print (type(df.iloc[:, 1]))
<class 'pandas.core.series.Series'>

print (df.iloc[:, 1:2])
     ID
0  A01G
1  A43B
2  A45C
3  A61B
4  B01J
5  B08B

print (type(df.iloc[:, 1:2]))
<class 'pandas.core.frame.DataFrame'>

您的第一个代码运行良好,因为返回了一个元素系列:

print (df.iloc[0, 1:2])
ID    A01G
Name: 0, dtype: object

print (type(df.iloc[0, 1:2]))
<class 'pandas.core.series.Series'>