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