Python 熊猫groupby和sklearn创作–;通过应用管道携带各种钥匙

Python 熊猫groupby和sklearn创作–;通过应用管道携带各种钥匙,python,pandas,scikit-learn,Python,Pandas,Scikit Learn,假设我有这样一个数据帧: 将熊猫作为pd导入 将numpy作为np导入 df=pd.DataFrame( { ‘x0’:[1,2,np.nan,5], “x1”:[4,5,6,10], “组”:[2,10,10,2], “id”:[1,2,3,4], } ) 我想对前缀为x的每一列应用一些任意估计器/估计器并集,因此我提出了一些组合估计器,如下所示: 来自sklearn.preprocessing导入StandardScaler的 pd.DataFrame(df.groupby('group'

假设我有这样一个数据帧:

将熊猫作为pd导入
将numpy作为np导入
df=pd.DataFrame(
{
‘x0’:[1,2,np.nan,5],
“x1”:[4,5,6,10],
“组”:[2,10,10,2],
“id”:[1,2,3,4],
}
)
我想对前缀为
x
的每一列应用一些任意估计器/估计器并集,因此我提出了一些组合估计器,如下所示:

来自sklearn.preprocessing导入StandardScaler的

pd.DataFrame(df.groupby('group').apply(lambda x:StandardScaler().fit_transform(x.drop(['group','id'],axis=1)).explode().values.tolist())
#      0    1
# 0 -1.0 -1.0
# 1  1.0  1.0
# 2  0.0 -1.0
#3.1.0
正如我们所看到的,实际上没有一种很好的方法来跟踪这些行所属的组或索引(
id
column)。我对反变换这些缩放特征不感兴趣。我如何跟踪这样一个管道中的
id


我看了一下,但找不到主键和其他我想随身携带的功能。

您可以使用
sklearn.compose.make\u column\u transformer执行类似操作。

从sklearn.compose导入make_column_transformer
列_-to_转换=[c表示df中的c,如果c不在['group','id']]
列\u非\u到\u转换=['group','id']
所有列=列到列的转换+列到列的转换
obj=制造柱变压器(
(StandardScaler(),列到列的转换),
('passthrough',columns_not_to_transform),
)
pd.DataFrame(df.groupby('group').apply(lambda x:obj.fit_transform(x)).explode().values.tolist()).rename(columns=dict(zip(range(len(all_columns)),all_columns)))
x0-x1组id
0 -1.0 -1.0    2.0  1.0
1  1.0  1.0    2.0  4.0
2  0.0 -1.0   10.0  2.0
3 NaN 1.0 10.0 3.0

您的想法是正确的,但是您可以通过正确的方式使用pandas方法简化和清理代码的几个部分:

from sklearn.preprocessing import StandardScaler
from sklearn.compose import make_column_transformer

ct = make_column_transformer(
    (StandardScaler(), df.head(1).filter(like='x').columns),
    remainder='passthrough'
)

data = df.groupby('group').apply(ct.fit_transform).explode()
pd.DataFrame(data.tolist(), columns=df.columns)
    x0   x1  group   id
0 -1.0 -1.0    2.0  1.0
1  1.0  1.0    2.0  4.0
2  0.0 -1.0   10.0  2.0
3  NaN  1.0   10.0  3.0