将 NumPy 数组转换为带有列的 Pandas 数据框

Posted

技术标签:

【中文标题】将 NumPy 数组转换为带有列的 Pandas 数据框【英文标题】:Convert NumPy arrays to Pandas Dataframe with columns 【发布时间】:2016-03-31 12:53:54 【问题描述】:

我想规范化我的分类值和数值。

cols = df.columns.values.tolist()
df_num = df.drop(CAT_COLUMNS, axis=1)
df_num = df_num.as_matrix()
df_num = preprocessing.StandardScaler().fit_transform(df_num)

df.fillna('NA', inplace=True)
df_cat = df.T.to_dict().values()

vec_cat = DictVectorizer( sparse=False )
df_cat = vec_cat.fit_transform(df_cat)

之后我需要将 2 个 numpy 数组组合回 pandas 数据帧,但下面的方法对我不起作用。

mas = np.hstack((df_num, df_cat))
df = pd.DataFrame(data=mas, columns=cols)

错误信息:ValueError: Shape of passed values is (475, 243), indices imply (83, 243)

另一种方法:

columns = df.columns.values.tolist()
for col in columns:
    try:
        if col in CAT_COLUMNS:
            df[col] = pd.get_dummies(df[col])
        else:
            df[col] = df[col].apply(preprocessing.StandardScaler().fit)
    except Exception, err:
        print 'Column: %s and msg=%s' % (col, err.message)

错误信息:

Column: DATE and msg=Singleton array array(1444424400.0) cannot be considered a valid collection. Column: QTR_HR_START and msg=Singleton array array(21600000L, dtype=int64) cannot be considered a valid collection. ...

PS。有什么办法可以避免 numpy 等?例如,我想利用 pandas_ml

【问题讨论】:

不起作用并不能解释为什么它失败了。为什么它不起作用?它给出了一个错误或者它没有给出预期的输出? 我添加了一个如何做这个纯熊猫的例子。不过,如果您的目标是机器学习,那么最好走纯 numpy 路线而不是转换回 pandas。 同意,但是我正在研究非常方便的库pandas_ml,这里所有的计算都是基于pandas的 【参考方案1】:

您正在寻找的是pandas.get_dummies()。它将对分类列执行一次热编码,并生成一个数据帧作为结果。从那里您可以使用pandas.concat([existing_df, new_df],axis=0) 将新列添加到现有数据框中。这将避免使用 numpy 数组。

如何使用它的示例:

for cat_column in CAT_COLUMNS:
    dummy_df = pd.get_dummies(df[column])

    #Optionally rename columns to indicate categorical feature name
    dummy_df.columns = ["%s_%s" % (cat_column, col) for col in dummy_df.columns]
    df = pd.concat([df, dummy_df], axis=1)

【讨论】:

关于以下方面的任何建议:1.如何正确替换分类列? 2 在这种情况下如何正确规范数字列?【参考方案2】:

那么非常简单的以下方法呢?

def normalize_dataframe(df):
    columns = df.columns.values.tolist()
    for col in columns:
        try:
            if col in CAT_COLUMNS:
                df[col] = pd.get_dummies(df[col])
            else:
                df[col] = preprocessing.StandardScaler().fit_transform(df[col])
        except Exception, err:
            print 'Column: %s and msg=%s' % (col, err.message)
    return df

【讨论】:

以上是关于将 NumPy 数组转换为带有列的 Pandas 数据框的主要内容,如果未能解决你的问题,请参考以下文章

将 Pandas 系列的二维 numpy 数组转换为一维 numpy 数组列的 Pandas DataFrame

如何将 Pandas DataFrame 的列和行子集转换为 numpy 数组?

将数据框转换为rec数组(将对象转换为字符串)

从带有描述的 Numpy nd 数组创建 Pandas DataFrame 的更快方法?

将 Pandas Dataframe 转换为 numpy 数组

将结构化 numpy 数组(包含子数组)转换为 pandas 数据帧