Python,使用.str.contains搜索数据帧列以查找子字符串时出错

Python,使用.str.contains搜索数据帧列以查找子字符串时出错,python,pandas,dataframe,filtering,contains,Python,Pandas,Dataframe,Filtering,Contains,如果您能使用python 2.7、pandas 0.22和easygui 0.98.1在这个问题上提供任何帮助,我将不胜感激 我试图将csv加载到pandas中,使用easygui(我认为返回为字符串列表)从用户选择的列表中指定列名,并在数据帧的某一列中搜索子字符串 import easygui as eg import pandas as pd # define vars_vars from choices of imagej outputs vars_vars = eg.multchoic

如果您能使用python 2.7、pandas 0.22和easygui 0.98.1在这个问题上提供任何帮助,我将不胜感激

我试图将csv加载到pandas中,使用easygui(我认为返回为字符串列表)从用户选择的列表中指定列名,并在数据帧的某一列中搜索子字符串

import easygui as eg
import pandas as pd

# define vars_vars from choices of imagej outputs
vars_vars = eg.multchoicebox
            (msg="\n\n\n\nPlease highlight variables included in ImageJ analysis:",
             title="IF Analysis - 2017",
             choices=["integrated density", "mean", 
                      "mean grey value", "area fraction"])

# add required imagej columns for later processing
vars_vars.insert(0, "label")
vars_vars.insert(0, "#")

#User input for csv file
file = eg.fileopenbox()

# load into dataframe using pandas and assign columns using chosen variables
df = pd.read_csv(file, header=None, names=None)
df.columns = vars_vars

# Search 'label' column for certain substring
df[df['label'].str.contains('substring')]
但我得到了一个错误:

Traceback (most recent call last):
  File "C:/Users/User/.PyCharmCE2017.3/config/scratches/scratch.py", line 61, in <module>
    df[df['label'].str.contains('nsv')]
  File "C:\Users\User\Miniconda2\envs\test2\lib\site-packages\pandas\core\generic.py", line 3614, in __getattr__
    return object.__getattribute__(self, name)
AttributeError: 'DataFrame' object has no attribute 'str'
以及我调用整个数据帧而不是df['label']的变体

但是,这些都不会导致在传递该修复行后出现错误,但在执行.str.contains行时总是返回类似的错误,该行表示dataframe对象没有属性映射(for.map(str))或str(for.astype(x))行


返回

<class 'pandas.core.frame.DataFrame'>

#                      int64
label                 object
integrated density     int64
dtype: object

                                        label
0         nc4_al1_I+pP_4x_contra_ctx_blue.tif
1        nc4_al1_I+pP_4x_contra_ctx_green.tif
2         nc4_al1_I1+pP_4x_contra_ctx_red.tif
3          nc4_al1_I+pP_4x_contra_hc_blue.tif
4         nc4_al1_I+pP_4x_contra_hc_green.tif

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 695 entries, 0 to 694
Data columns (total 1 columns):
(label,)    695 non-null object
dtypes: object(1)
memory usage: 5.5+ KB
None

Traceback (most recent call last):
  File "C:/Users/Shon/.PyCharmCE2017.3/config/scratches/scratch.py", line 67, in <module>
    print type(df['label'][0])
  File "C:\Users\User\Miniconda2\envs\test2\lib\site-packages\pandas\core\frame.py", line 2137, in __getitem__
    return self._getitem_multilevel(key)
  File "C:\Users\User\Miniconda2\envs\test2\lib\site-packages\pandas\core\frame.py", line 2181, in _getitem_multilevel
    loc = self.columns.get_loc(key)
  File "C:\Users\User\Miniconda2\envs\test2\lib\site-packages\pandas\core\indexes\multi.py", line 2072, in get_loc
    loc = self._get_level_indexer(key, level=0)
  File "C:\Users\User\Miniconda2\envs\test2\lib\site-packages\pandas\core\indexes\multi.py", line 2362, in _get_level_indexer
    loc = level_index.get_loc(key)
  File "C:\Users\User\Miniconda2\envs\test2\lib\site-packages\pandas\core\indexes\base.py", line 2527, in get_loc
    return self._engine.get_loc(self._maybe_cast_indexer(key))
  File "pandas/_libs/index.pyx", line 117, in pandas._libs.index.IndexEngine.get_loc
  File "pandas/_libs/index.pyx", line 139, in pandas._libs.index.IndexEngine.get_loc
  File "pandas/_libs/hashtable_class_helper.pxi", line 1265, in pandas._libs.hashtable.PyObjectHashTable.get_item
  File "pandas/_libs/hashtable_class_helper.pxi", line 1273, in pandas._libs.hashtable.PyObjectHashTable.get_item
KeyError: 0

导致在打印其类型时将列更改为一个系列,这使我能够正确地.str.包含数据。

查看
类型(df['label']).info()的输出:


将多索引列标题展平为单级列索引,并为df['label']创建一个
pd.Series
数据类型,然后允许使用字符串访问器和
contains

类型(df['label'])return?“”——感谢您的帮助编辑:我创建了df.dtypes并获得了以下输出:
#int64 label object integrated density int64 dtype:object
是的,这是正确的,您的df['label']不是一个系列。str访问器在系列上工作。df['label'].head()返回的结果包含在您的问题中。谢谢。更新了。非常感谢。你建议我试着把这些列转换成系列吗?还有,所以
print(df['labels'].info())
。您有一个结构奇怪的数据帧。我想真正了解你到底有什么。通常,类型(df['label'])返回pd.Series。但你的不是。所以,你有一些非标准的东西。@SK如果这个解决方案对你有帮助,你可以检查一下这个答案。非常感谢。
print type(df['label'])
print df.dtypes
print df['label'].head()
print (df['label'].info())
print type(df['label'][0])
<class 'pandas.core.frame.DataFrame'>

#                      int64
label                 object
integrated density     int64
dtype: object

                                        label
0         nc4_al1_I+pP_4x_contra_ctx_blue.tif
1        nc4_al1_I+pP_4x_contra_ctx_green.tif
2         nc4_al1_I1+pP_4x_contra_ctx_red.tif
3          nc4_al1_I+pP_4x_contra_hc_blue.tif
4         nc4_al1_I+pP_4x_contra_hc_green.tif

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 695 entries, 0 to 694
Data columns (total 1 columns):
(label,)    695 non-null object
dtypes: object(1)
memory usage: 5.5+ KB
None

Traceback (most recent call last):
  File "C:/Users/Shon/.PyCharmCE2017.3/config/scratches/scratch.py", line 67, in <module>
    print type(df['label'][0])
  File "C:\Users\User\Miniconda2\envs\test2\lib\site-packages\pandas\core\frame.py", line 2137, in __getitem__
    return self._getitem_multilevel(key)
  File "C:\Users\User\Miniconda2\envs\test2\lib\site-packages\pandas\core\frame.py", line 2181, in _getitem_multilevel
    loc = self.columns.get_loc(key)
  File "C:\Users\User\Miniconda2\envs\test2\lib\site-packages\pandas\core\indexes\multi.py", line 2072, in get_loc
    loc = self._get_level_indexer(key, level=0)
  File "C:\Users\User\Miniconda2\envs\test2\lib\site-packages\pandas\core\indexes\multi.py", line 2362, in _get_level_indexer
    loc = level_index.get_loc(key)
  File "C:\Users\User\Miniconda2\envs\test2\lib\site-packages\pandas\core\indexes\base.py", line 2527, in get_loc
    return self._engine.get_loc(self._maybe_cast_indexer(key))
  File "pandas/_libs/index.pyx", line 117, in pandas._libs.index.IndexEngine.get_loc
  File "pandas/_libs/index.pyx", line 139, in pandas._libs.index.IndexEngine.get_loc
  File "pandas/_libs/hashtable_class_helper.pxi", line 1265, in pandas._libs.hashtable.PyObjectHashTable.get_item
  File "pandas/_libs/hashtable_class_helper.pxi", line 1273, in pandas._libs.hashtable.PyObjectHashTable.get_item
KeyError: 0
df.columns.map(''.join).str.strip()
<class 'pandas.core.frame.DataFrame'> 
RangeIndex: 695 entries, 0 to 694 
Data columns (total 1 columns): 
(label,) 695 non-null object 
dtypes: object(1) memory usage: 5.5+ KB None
df.columns = df.columns.map(''.join).str.strip()