【问题标题】:Convert heterogeneous pandas.DataFrame to homogeneous one将异构 pandas.DataFrame 转换为同质的
【发布时间】:2019-02-13 13:03:50
【问题描述】:

我想分析 observations/variables 形式的异构数据,这些数据包含在 pandas.DataFrame 中,如下所示:

   Age   Name     Ok  Result
0   25    Bob   True     1.2
1   41   John  False     0.5
2   30  Alice   True     0.3

为此,我通常使用pandas.DataFrame.values 将其转换为Numpy 表示,从而获得:

[[25 'Bob'   True  1.2]
 [41 'John'  False 0.5]
 [30 'Alice' True  0.3]]

如果我正确理解文档,则仅包含 object 类型:

具有混合类型列(例如,str/object、int64、float32)的 DataFrame 会生成容纳这些混合类型(例如,object)的最广泛类型的 ndarray。

问题:如何将异构类型的pandas.DataFrame(或numpy.ndarray)转换为具有同类数字类型的类型,如下所示:

[[25.0  1.0  1.0  1.2]
 [41.0  2.0  0.0  0.5]
 [30.0  3.0  1.0  0.3]]

'Bob'1.0'John'2.0 之间存在对应关系 ...True1.0 ...

我问这个是因为我想对所有数据执行sklearn.decomposition.PCA,这在处理字符串值时会产生错误。


这是一个最小的(不是)工作示例:

import numpy as np
import pandas as pd
from sklearn.decomposition import PCA

d  = {'Name': ['Bob', 'John', 'Alice'], 'Age': [25, 41, 30], 'Result' : [1.2, 0.5, 0.3], 'Ok' : [True, False, True]}
df = pd.DataFrame(data=d)

df.info()
print(df)

data = df.values

print(data)

pca = PCA(n_components=all)
pca.fit(data)

【问题讨论】:

    标签: python pandas numpy dataframe scikit-learn


    【解决方案1】:

    首先,如果它是原始数据的样本,那么从 PCA 的概念来看,您无法从 PCA 中获得好的结果。 PCA 的主要用例是高维的多变量数据。因此,将 Bob、Jhon、Alice 的值插入为 1、2、3,您将获得任何好的结果。因为它们是唯一的 id,而不是来自同一类的重复观察。但如果只是出于学习目的,您可以将数据转换如下:

    import pandas as pd
    
    d  = {'Name': ['Bob', 'John', 'Alice'], 
          'Age': [25, 41, 30], 
          'Result' : [1.2, 0.5, 0.3], 
          'Ok' : [True, False, True]
          }
    
    df = pd.DataFrame(data=d)
    
    # change the true false to int
    df['Ok'] = df.Ok.astype(int)
    
    # put all unique name in the list
    name_list = list(df.Name.unique())
    # create a name map to replace the value
    name_map = {name:id for  id, name in enumerate(name_list)}
    
    # apply the map
    df['Name'] = df['Name'].replace(name_map)
    
    # put in to the array
    data = df.values
    

    【讨论】:

      猜你喜欢
      • 2016-04-12
      • 2014-08-11
      • 2020-07-06
      • 2018-08-08
      • 2019-02-01
      • 1970-01-01
      • 2023-02-03
      • 2021-12-26
      • 1970-01-01
      相关资源
      最近更新 更多