【问题标题】:Issue with Groupby.apply on multindex dataframeGroup By.apply 在多索引数据帧上的问题
【发布时间】:2020-01-04 23:54:39
【问题描述】:

我有一个多索引数据框(索引有 2 个级别)和我的变量作为列。

我正在尝试为每个一级索引应用一个函数。这个想法只是对数据本身进行滚动标准化:

from sklearn.preprocessing import robust_scale, power_transform

df[list_feat_num] = df[list_feat_num].groupby(level='date').apply(lambda x: power_transform(x))

并得到以下错误:

ValueError: Must have equal len keys and value when setting with an iterable

重现示例

import numpy as np

iterable = [[1,2,3,4],['a','b','d','e','f','g','h']]
idx = pd.MultiIndex.from_product(iterable, names=['date', 'sub'])
df = pd.DataFrame(np.random.randn(28, 4), index =idx, columns=['var1', 'var2', 'var3', 'var4'])


df[['var1', 'var2']] = df[['var1', 'var2']].groupby(level='date').apply(lambda x: power_transform(x, method='yeo-johnson' ))

经过调查,该函数已正确应用,但一切都返回到 Serie,而不是返回到多索引数据帧。因此错误,因为它无法分配回原始数据帧。

我能做什么?是否与广播参数有关?

非常感谢

【问题讨论】:

  • 好的,我正在更新我的帖子
  • 更新了可重现的示例

标签: python-3.x pandas scikit-learn pandas-groupby


【解决方案1】:

对我来说,在具有组索引值的 lambda 函数中添加 DataFrame 构造函数:

np.random.seed(123)
from sklearn.preprocessing import robust_scale, power_transform
import numpy as np

iterable = [[1,2,3,4],['a','b','d','e','f','g','h']]
idx = pd.MultiIndex.from_product(iterable, names=['date', 'sub'])
df = pd.DataFrame(np.random.randn(28, 4), index =idx, columns=['var1', 'var2', 'var3', 'var4'])

f = lambda x: pd.DataFrame(power_transform(x, method='yeo-johnson'), index=x.index)
df[['var1', 'var2']] = df.groupby(level='date')['var1', 'var2'].apply(f)

您的解决方案:

df[['var1', 'var2']] = df[['var1', 'var2']].groupby(level='date').apply(f)

print (df)
              var1      var2      var3      var4
date sub                                        
1    a   -1.175573  0.381748  0.282978 -1.506295
     b   -0.764622  0.894719 -2.426679 -0.428913
     d    0.691332 -1.262392 -0.678886 -0.094709
     e    0.865815 -1.043243 -0.443982 -0.434351
     f    1.415725  1.300722  1.004054  0.386186
     g    0.280003  0.770592 -0.935834  1.175829
     h   -1.312680 -1.042147  0.907105 -1.428681
2    a   -0.206304 -0.500801 -0.255619 -2.798589
     b   -1.666581 -0.310982  0.927462 -0.173636
     d   -0.072625  0.877042 -0.879536  0.283627
     e   -0.813829 -1.675651 -0.390900  0.573806
     f    0.246787  0.375910  2.392365  0.412912
     g    0.872225  1.659402 -1.294085 -1.038788
     h    1.640327 -0.424921  0.029683  1.069316
3    a    0.479722  1.617368  1.495644  1.069393
     b   -1.115289  0.643884  0.314272 -1.326265
     d    1.140015  0.656820  0.045490 -0.233092
     e   -1.420566  0.005083  0.468439 -0.831155
     f    0.812374 -1.532627 -2.123100  1.039727
     g   -0.826485 -0.361822 -0.837517 -1.605963
     h    0.930229 -1.028705  1.660952  0.807308
4    a   -0.603502 -0.331612 -0.732462 -1.212523
     b    1.777348  0.858457  1.150206 -1.267352
     d    0.016055  1.603220 -0.335011  1.031114
     e   -1.756332 -0.633755  0.379401 -0.379176
     f    0.508385 -1.340540  0.712265  2.598304
     g   -0.227608  0.750350  0.179549 -1.861976
     h    0.285653 -0.906120 -0.427680  1.242870

【讨论】:

  • 感谢您的回答。在 groupby 之后而不是之前传递列的直觉是什么?
  • @lucaschn - 在 pandas 中的 groupby 之后,在某些函数中传递列以进行处理是更常见的方式;)
猜你喜欢
  • 1970-01-01
  • 2021-09-29
  • 1970-01-01
  • 2021-01-12
  • 1970-01-01
  • 2023-03-25
  • 2019-08-12
  • 2018-05-18
  • 2021-01-28
相关资源
最近更新 更多