【问题标题】:Pandas read_csv does not load a comma separated CSV properlyPandas read_csv 无法正确加载逗号分隔的 CSV
【发布时间】:2018-02-04 05:04:57
【问题描述】:

现在,我分析卡格尔的泰坦尼克号挑战。 我的代码是这样的:

但我的理想输出是:

所以,在我的最后一个代码中是

df["Age"].fillna(df.Age.median(), inplace=True)

然后发生错误

---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
/Users/XXXi/anaconda/envs/py36/lib/python3.6/site-packages/pandas/indexes/base.py in get_loc(self, key, method, tolerance)
   2133             try:
-> 2134                 return self._engine.get_loc(key)
   2135             except KeyError:

pandas/index.pyx in pandas.index.IndexEngine.get_loc (pandas/index.c:4433)()

pandas/index.pyx in pandas.index.IndexEngine.get_loc (pandas/index.c:4279)()

pandas/src/hashtable_class_helper.pxi in pandas.hashtable.PyObjectHashTable.get_item (pandas/hashtable.c:13742)()

pandas/src/hashtable_class_helper.pxi in pandas.hashtable.PyObjectHashTable.get_item (pandas/hashtable.c:13696)()

KeyError: 'Age'

During handling of the above exception, another exception occurred:

KeyError                                  Traceback (most recent call last)
<ipython-input-4-9763f0a9951c> in <module>()
----> 1 df["Age"].fillna(df.Age.median(), inplace=True)

/Users/XXXi/anaconda/envs/py36/lib/python3.6/site-packages/pandas/core/frame.py in __getitem__(self, key)
   2057             return self._getitem_multilevel(key)
   2058         else:
-> 2059             return self._getitem_column(key)
   2060 
   2061     def _getitem_column(self, key):

/Users/XXXi/anaconda/envs/py36/lib/python3.6/site-packages/pandas/core/frame.py in _getitem_column(self, key)
   2064         # get column
   2065         if self.columns.is_unique:
-> 2066             return self._get_item_cache(key)
   2067 
   2068         # duplicate columns & possible reduce dimensionality

/Users/XXXi/anaconda/envs/py36/lib/python3.6/site-packages/pandas/core/generic.py in _get_item_cache(self, item)
  1384         res = cache.get(item)
   1385         if res is None:
-> 1386             values = self._data.get(item)
   1387             res = self._box_item_values(item, values)
   1388             cache[item] = res

/Users/XXXi/anaconda/envs/py36/lib/python3.6/site-packages/pandas/core/internals.py in get(self, item, fastpath)
   3541 
   3542             if not isnull(item):
-> 3543                 loc = self.items.get_loc(item)
   3544             else:
   3545                 indexer = np.arange(len(self.items))[isnull(self.items)]

/Users/XXXi/anaconda/envs/py36/lib/python3.6/site-packages/pandas/indexes/base.py in get_loc(self, key, method, tolerance)
   2134                 return self._engine.get_loc(key)
   2135             except KeyError:
-> 2136                 return self._engine.get_loc(self._maybe_cast_indexer(key))
   2137 
   2138         indexer = self.get_indexer([key], method=method, tolerance=tolerance)

pandas/index.pyx in pandas.index.IndexEngine.get_loc (pandas/index.c:4433)()

pandas/index.pyx in pandas.index.IndexEngine.get_loc (pandas/index.c:4279)()

pandas/src/hashtable_class_helper.pxi in pandas.hashtable.PyObjectHashTable.get_item (pandas/hashtable.c:13742)()

pandas/src/hashtable_class_helper.pxi in pandas.hashtable.PyObjectHashTable.get_item (pandas/hashtable.c:13696)()

KeyError: 'Age'

我使用sep=',',所以我真的不明白为什么这段代码不能在每个逗号中分开。我该如何解决这个问题?

我遵循了一个答案,但发生了错误(我不知道为什么)

我的数据是

【问题讨论】:

    标签: python pandas csv dataframe kaggle


    【解决方案1】:

    注意!

    主要问题是下载数据。如果您在加载和处理 Kaggle Titanic 数据集时遇到问题,您可以从 here 重新下载 CSV 并重新运行您的程序。


    你可以传delimiter=',':

    df = pd.read_csv("Desktop/data/train.csv", delimiter=',')
    print(df.head())
    
       PassengerId  Survived  Pclass  \
    0            1         0       3   
    1            2         1       1   
    2            3         1       3   
    3            4         1       1   
    4            5         0       3   
    
                                                    Name     Sex   Age  SibSp  \
    0                            Braund, Mr. Owen Harris    male  22.0      1   
    1  Cumings, Mrs. John Bradley (Florence Briggs Th...  female  38.0      1   
    2                             Heikkinen, Miss. Laina  female  26.0      0   
    3       Futrelle, Mrs. Jacques Heath (Lily May Peel)  female  35.0      1   
    4                           Allen, Mr. William Henry    male  35.0      0   
    
       Parch            Ticket     Fare Cabin Embarked  
    0      0         A/5 21171   7.2500   NaN        S  
    1      0          PC 17599  71.2833   C85        C  
    2      0  STON/O2. 3101282   7.9250   NaN        S  
    3      0            113803  53.1000  C123        S  
    4      0            373450   8.0500   NaN        S  
    
    
    print(df.columns)
    
    Index(['PassengerId', 'Survived', 'Pclass', 'Name', 'Sex', 'Age', 'SibSp',
           'Parch', 'Ticket', 'Fare', 'Cabin', 'Embarked'],
          dtype='object')
    

    接下来,您可以创建排序映射:

    mapping = {'male' : 0, 'female' : 1}
    

    你会打电话给pd.Series.replace

    df.Sex = df.Sex.replace(mapping)
    print(df.Sex)
    
    0    0
    1    1
    2    1
    3    1
    4    0
    Name: Sex, dtype: int64
    

    【讨论】:

    • 根据 pandas 文档,delimiter 只是 sep 的替代名称:pandas.pydata.org/pandas-docs/stable/generated/…
    • @StefanK 根据我的经验,在某些情况下,我可以通过使用它们的组合或将其中的一个更改为另一个来使工作正常。我认为它们是互补的,而不是替代品。编辑:稍微改变了我的答案。
    • @cᴏʟᴅsᴘᴇᴇᴅ 谢谢你的回答。我关注了你的消息,但发生了 AttributeError。我更新了我的问题,如果你知道什么,请帮助我。
    • @user8385498 运行我所有的代码,伙计。您只关注了映射部分。
    • 我完全按照你的代码,但同样的错误发生(我发现代码之前有一个错误)我更新了我的问题,如果你发现了一些错误,请告诉我。
    【解决方案2】:

    您的 read_csv 看起来不错,同一行中的替换似乎造成了麻烦。

    尝试先将 csv 原样读取到变量 df 中。这样你的代码会更干净。

    df = pd.read_csv('Desktop/data/train.csv',sep=',')
    df['Sex'] = df['Sex'].map( {'female': 1, 'male': 0} )
    

    但您可以完全保留 sep 参数,因为逗号是标准分隔符

    在将文件读入 df 并使用后,或者在新行上使用替换进行清理 inplace=True:

    df['Sex'].replace({'male': 0, 'female': 1}, inplace=True)
    

    一般建议:

    Kaggle 网页支持内核部分的脚本共享和评论。 如果您被困在某个地方,请尝试查看它以了解如何进行分析:

    https://www.kaggle.com/c/titanic/kernels

    【讨论】:

    • thx, ur cmets.Your mean, df= pd.read_csv("Desktop/data/train.csv",sep=',',inplace=True, regex=True).replace("男",0).replace("女",1),对吧?
    • 但是使用这段代码,我得到了一个错误,TypeError Traceback (最近一次调用最后) in () ----> 1 df= pd .read_csv("Desktop/data/train.csv",sep=',',inplace=True, regex=True).replace("male",0).replace("female",1) TypeError: parser_f()有一个意外的关键字参数“就地”,我误解了你的信息吗?
    • 我编辑了我的原始答案...在新行上进行清理
    • 你的消息是什么意思
    • df= pd.read_csv("Desktop/data/train.csv",sep=',',inplace=True, regex=True).replace("male",0).replace( "女",1) df.cleaning(inplace=True, regex=True)
    猜你喜欢
    • 2021-05-28
    • 2017-07-19
    • 2011-01-24
    • 1970-01-01
    • 2020-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-08
    相关资源
    最近更新 更多