如何使用 sklearn 转换器扁平化 pandas 数据框中的数组类型?

Posted

技术标签:

【中文标题】如何使用 sklearn 转换器扁平化 pandas 数据框中的数组类型?【英文标题】:How to flatten array types inside pandas dataframe with an sklearn transformer? 【发布时间】:2022-01-17 09:03:45 【问题描述】:

我有一个带有标量列和数组列的 pandas 数据框,例如

df = pd.DataFrame(
  "scalar": [1, 2, 3, 4],
  "array": [[10,20], [30,40], [50, 60], [70, 80]],
)

我想写一个 sklearn 转换器来把它展平,这样

transformer = ???
transformer.fit_transform(df)
===>
[[1 10 20
  2 30 40
  3 50 60
  4 70 80]]

我怎样才能做到这一点?

【问题讨论】:

【参考方案1】:

由于这是一个无状态转换,您可以使用FunctionTransformer 从函数中定义一个转换器。

import pandas as pd
import numpy as np
from sklearn.preprocessing import FunctionTransformer

df = pd.DataFrame(
  "scalar": [1, 2, 3, 4],
  "array": [[10,20], [30,40], [50, 60], [70, 80]],
)


def flatten_df_rows(df):
    def flatten(row):
        # flatten lists recursively 
        for val in row:
            if isinstance(val, list):
                yield from flatten(val)
            else:
                yield val
    # flatten each row of the df recursively           
    return np.array([list(flatten(row)) for row in df.values.tolist()])

transform = FunctionTransformer(flatten_df_rows)
out = transform.fit_transform(df)

输出:

>>> out 

array([[ 1, 10, 20],
       [ 2, 30, 40],
       [ 3, 50, 60],
       [ 4, 70, 80]])

【讨论】:

【参考方案2】:

这就是你要找的吗?

df[['array_1','array_2']] = df['array'].apply(pd.Series)
out = df.drop('array', axis=1).values

输出:

array([[ 1, 10, 20],
       [ 2, 30, 40],
       [ 3, 50, 60],
       [ 4, 70, 80]], dtype=int64)

【讨论】:

谢谢曼莱!这很好,但问题是我的“数组”可能非常大,所以我不想在转换为 numpy 数组之前将它们分解为单独的列。我还想在 sklearn 框架中做这件事,以便我以后可以添加其他转换器。

以上是关于如何使用 sklearn 转换器扁平化 pandas 数据框中的数组类型?的主要内容,如果未能解决你的问题,请参考以下文章

Pandas Sklearn Pipeline - DataMapper 转换的 CV?

使用 python 和 pandas 将多数组 json 数据转换为扁平数据框

将sklearn糖尿病数据集转换为pandas DataFrame [重复]

将 pandas 稀疏数据帧转换为稀疏 numpy 矩阵以供 sklearn 使用?

如何将 sklearn 管道转换为 pyspark 管道?

在 pandas DataFrame 中,如何使用索引将“扁平化”变量“扁平化”成新列?