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

5

我希望对我的分类和数值数据进行归一化处理。

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)

接下来我需要将两个numpy数组合并为一个pandas dataframe,但是下面的方法对我不起作用。

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

错误信息: ValueError: 传递的值的形状为(475,243),索引指示为(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)

错误信息:

列名:DATE,错误信息:单个元素数组array(1444424400.0)不能被视为有效集合。 列名:QTR_HR_START,错误信息:单个元素数组array(21600000L, dtype=int64)不能被视为有效集合。 ...

附注:有没有避免使用NumPy等库的方法?例如,我想利用库。


不起作用并没有解释失败的原因。为什么它不起作用?它是否给出了错误或者没有给出预期的输出? - EdChum
我添加了一个纯pandas的示例,演示如何实现此操作。不过,如果你的目标是机器学习,最好选择纯numpy路线,而不是转换回pandas。 - David Maust
1
同意,但我正在调查非常方便的库pandas_ml,这里所有的计算都基于pandas。 - SpanishBoy
2个回答

2
你需要的是 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. 在这种情况下如何正确地归一化数值列?
- SpanishBoy

0

那么,采用以下相当简单的方法如何?

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接