【问题标题】:Why is my pandas df all object data types as opposed to e.g. int, string etc?为什么我的 pandas df 是所有对象数据类型,而不是例如int,字符串等?
【发布时间】:2018-07-14 15:29:21
【问题描述】:

在this SO post 上有人建议使用 df.info() 来获取有关 pandas df 的信息,包括每个字段的数据类型。

在此粘贴部分此人的回答:

train.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 12 columns):
PassengerId    891 non-null int64
Survived       891 non-null int64
Pclass         891 non-null int64
Name           891 non-null object
Sex            891 non-null object
Age            714 non-null float64
SibSp          891 non-null int64
Parch          891 non-null int64
Ticket         891 non-null object
Fare           891 non-null float64
Cabin          204 non-null object
Embarked       889 non-null object
dtypes: float64(2), int64(5), object(5)
memory usage: 83.6+ KB

我在自己的 pandas 数据框上试过这个:

sessions1DF.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 69085 entries, 0 to 69084
Data columns (total 10 columns):
ga:date                69085 non-null object
ga:hour                69085 non-null object
ga:dimension1          69085 non-null object
ga:dimension2          69085 non-null object
ga:userType            69085 non-null object
ga:landingpagePath     69085 non-null object
ga:deviceCategory      69085 non-null object
ga:sessions            69085 non-null object
ga:goal1Completions    69085 non-null object
ga:bounces             69085 non-null object
dtypes: object(10)
memory usage: 5.3+ MB

一切都是我期望字符串和数字组合的对象。这是头:

sessions1DF.head()
Out[13]: 
    ga:date ga:hour    ...     ga:goal1Completions ga:bounces
0  20180605      18    ...                       0          0
1  20180605      18    ...                       0          1
2  20180605      18    ...                       0          0
3  20180605      18    ...                       0          1
4  20180605      18    ...                       0          0

[5 rows x 10 columns]

(我希望我知道如何强制 pandas head() 向我显示所有功能,而不仅仅是上面显示的 4 个)。

sessions1DF 实际上有一个名为“dimension1”的字段,它应该是一个字符串,我想将它与另一个数据框 session2DF 连接起来,它们都共享相同的字段“dimension1”。所以我想在维度 1 上加入他们。

我的 pandas 数据框有什么“错误”吗?有没有办法将所有对象“提取”为其中的实际数据?大概我的数据框不是正常格式,每个字段只是一个数据向量。

有没有办法改变我的数据框,这样如果我输入sessions1DF.info(),我会得到类似于粘贴在顶部的结果,每一列都是字符串、int 等而不是对象?

【问题讨论】:

  • 嗨,我今天也遇到了类似的挑战。以下是我的发现:a)我有多个标题 b)缺失值 c)“。” &“-”。由于我从数据库中提取数据,由于不正确调整行大小和页面大小,我有多个标题。我手动删除了记录,它运行良好,并且有 int、float、obj 全部。

标签: python pandas dataframe


【解决方案1】:

您看到的问题可能与您将数据读入数据帧的方式有关。假设您使用了其中一种 pandas 阅读器,例如 csv 阅读器:

import pandas as pd
df = pd.read_csv('some_file.csv')

您的文件中可能包含以下一种或多种情况:

  1. 代表缺失值的字符串字符
  2. 该列中的类型为非数字的多个页眉或页脚。
  3. 表格中间的奇怪行会破坏类型推断。

pandas 阅读器(或任何试图解析分隔数据并动态计算数据类型的阅读器)必须查看列中的数据并问自己“此列中的所有内容都是数字吗?”如果是这样,则将类型转换为数字(int 或 float)。如果解析器/阅读器在列中看到不是数字的字符串,则整列将被强制转换为“object”而不是 int 或 float。

要探索这种可能性,您可以使用文本编辑器(notepad++、Visual Studio 代码等)打开您的文本文件,然后直观地检查结构。

如果文件太大而无法打开和目视扫描(69,000 行不算大),您可以尝试使用 pandas 阅读器功能的各种选项。要查看这些,请尝试输入以下内容:

pd.read_csv?

查看所有可用选项。例如,您可能只想尝试读取前 n 行,或者尝试跳过顶部的几行,或者指定代表缺失值的字符,以便在检查类型时知道跳过。

您甚至可以将每列数据类型传递给读取,以便它“知道”哪些列是数字、哪些是字符串、哪些是 date_time 等。

此外,在 pandas 中,您可以控制选项,以便在查看数据框时看到所有列,而不是……指示,请参阅 pandas 网站上的 pandas.options.display。

pandas options

【讨论】:

  • 感谢您的建议。这正好解决了我的问题。
【解决方案2】:

示例:

df = pd.DataFrame({'strings':['a','d','f'],
                   'dicts':[{'a':4}, {'c':8}, {'e':9}],
                   'lists':[[4,8],[7,8],[3]],
                   'tuples':[(4,8),(7,8),(3,)],
                   'sets':[set([1,8]), set([7,3]), set([0,1])] })

print (df)
      dicts   lists    sets strings  tuples
0  {'a': 4}  [4, 8]  {8, 1}       a  (4, 8)
1  {'c': 8}  [7, 8]  {3, 7}       d  (7, 8)
2  {'e': 9}     [3]  {0, 1}       f    (3,)

所有值都具有相同的dtypes:

print (df.dtypes)
dicts      object
lists      object
sets       object
strings    object
tuples     object
dtype: object

但type不一样,如果需要循环检查:

for col in df:
    print (df[col].apply(type))

0    <class 'dict'>
1    <class 'dict'>
2    <class 'dict'>
Name: dicts, dtype: object
0    <class 'list'>
1    <class 'list'>
2    <class 'list'>
Name: lists, dtype: object
0    <class 'set'>
1    <class 'set'>
2    <class 'set'>
Name: sets, dtype: object
0    <class 'str'>
1    <class 'str'>
2    <class 'str'>
Name: strings, dtype: object
0    <class 'tuple'>
1    <class 'tuple'>
2    <class 'tuple'>
Name: tuples, dtype: object

或列的第一个值:

print (type(df['strings'].iat[0]))
<class 'str'>

print (type(df['dicts'].iat[0]))
<class 'dict'>

print (type(df['lists'].iat[0]))
<class 'list'>

print (type(df['tuples'].iat[0]))
<class 'tuple'>

print (type(df['sets'].iat[0]))
<class 'set'>

或applymap:

print (df.applymap(type))
         strings           dicts           lists           tuples  \
0  <class 'str'>  <class 'dict'>  <class 'list'>  <class 'tuple'>   
1  <class 'str'>  <class 'dict'>  <class 'list'>  <class 'tuple'>   
2  <class 'str'>  <class 'dict'>  <class 'list'>  <class 'tuple'>   

            sets  
0  <class 'set'>  
1  <class 'set'>  
2  <class 'set'> 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-29
    • 1970-01-01
    • 2019-08-12
    • 2012-10-28
    • 1970-01-01
    • 2021-11-19
    相关资源
    最近更新 更多