为什么我的 pandas df 是所有对象数据类型而不是 int、string 等?

Dou*_*Fir 5 python dataframe pandas

这篇SO 文章中,有人建议使用 df.info() 来获取有关 aa 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
Run Code Online (Sandbox Code Playgroud)

我在我自己的 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
Run Code Online (Sandbox Code Playgroud)

一切都是一个对象,我期望它是字符串和数字的某种组合。这是头部:

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]
Run Code Online (Sandbox Code Playgroud)

(我希望我知道如何强迫 pandashead()向我展示所有功能,而不仅仅是上面向我展示的 4 个功能)。

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

我的 pandas 数据框有“问题”吗?有没有办法“提取”所有对象作为其中的实际数据?据推测,我的数据帧不是正常格式,其中每个字段只是一个数据向量。

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

jez*_*ael 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,)
Run Code Online (Sandbox Code Playgroud)

所有值都相同dtypes

print (df.dtypes)
dicts      object
lists      object
sets       object
strings    object
tuples     object
dtype: object
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

或列的第一个值:

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'>
Run Code Online (Sandbox Code Playgroud)

或者通过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'> 
Run Code Online (Sandbox Code Playgroud)