为什么我的 pandas df 是所有对象数据类型而不是例如int、字符串等?

问题描述 投票:0回答:3

this 所以有人建议使用 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()
我会得到类似于顶部粘贴的结果,每列都是字符串、整数等而不是对象?

python pandas dataframe
3个回答
2
投票

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

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

您的文件中可能包含以下一个或多个条件:

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

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

要探索这种可能性,您可以使用文本编辑器(notepad++、Visual Studio Code 等)打开文本文件并目视检查结构。

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

pd.read_csv?

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

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

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

熊猫选项


1
投票

样品

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'> 

0
投票

如果我们在一列或多个标题/值等中有一些不同的数据类型,我们将数据类型作为对象获取。这里的对象意味着它可以接受任何类型的值。处理完这些事情后,我们就得到了正确的数据类型。

© www.soinside.com 2019 - 2024. All rights reserved.