如何使用 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 [重复]