【问题标题】:Sample Pandas based on dictionary基于字典的 Pandas 示例
【发布时间】:2018-11-27 09:45:15
【问题描述】:

我正在尝试根据字典和特定列对 pandas DataFrame 进行采样。所以对于y 列的每个值,我确切地知道我想选择多少个观察值。

我可以通过 groupby apply 组合来做到这一点:

import pandas as pd

df = pd.DataFrame({'y': [2,2,0,0,0,1,1,1,1,1], 'x': 1, 'z': 2})

    y   x   z
0   2   1   2
1   2   1   2
2   0   1   2
3   0   1   2
4   0   1   2
5   1   1   2

sizes = {0: 2, 1: 1, 2:1}

df.groupby('y').apply(lambda x: x.sample(sizes[x['y'].values[0]]))

y y x z

0 2 0 1 2 4 0 1 2 1 5 1 1 2 2 0 2 1 2

但是,如果我使用 unique 而不是 values(应该是等价的,我会在数据帧上收到一个奇怪的 KeyError: 'y' 错误:

df.groupby('y').apply(lambda x: x.sample(sizes[x.y.unique()[0]]))

有人可以解释为什么会这样吗?

编辑:

这发生在 0.23.1 而不是 0.23.1 所以这可能是一个错误。

【问题讨论】:

  • 您按y 分组,然后再次采用y 的唯一性?每次迭代 x 都按y 对对象进行分组。
  • 你觉得df.groupby('y').apply(lambda x: x.sample(sizes[df.y.unique()[0]])) 吗?

标签: python pandas sample keyerror


【解决方案1】:

我觉得你需要.name属性:

df1 = df.groupby('y').apply(lambda x: x.sample(sizes[x.name]))
print (df1)

     y  x  z
y           
0 4  0  1  2
  2  0  1  2
1 6  1  1  2
2 0  2  1  2

如果可能某些值在字典中不匹配,请使用 get0 来表示不匹配的值:

df1 = df.groupby('y').apply(lambda x: x.sample(sizes.get(x.name, 0)))

编辑:

问题是unique 返回一个元素的numpy数组:

def f(x):
    print (x['y'].unique())
    print (x['y'].unique()[0])
    print (sizes[x['y'].unique()[0]])
    print (x.sample(sizes[x['y'].unique()[0]]))

df1 = df.groupby('y').apply(f)

[0]
0
2
   y  x  z
2  0  1  2
4  0  1  2
[0]
0
2
   y  x  z
4  0  1  2
2  0  1  2
[1]
1
1
   y  x  z
6  1  1  2
[2]
2
1
   y  x  z
0  2  1  2

df1 = df.groupby('y').apply(lambda x: x.sample(sizes[x.y.unique()[0]]))
print (df1)
     y  x  z
y           
0 4  0  1  2
  2  0  1  2
1 6  1  1  2
2 0  2  1  2

【讨论】:

  • x.name 更优雅,不知道。但是为什么另一个给我一个错误?
  • @niczky12 - 添加到解决方案中 - 为调试创建函数 flambda func 相同
  • 所以df.groupby('y').apply(lambda x: x.sample(sizes[x.y.unique()[0]])) 应该可以工作,对吧?但是我仍然遇到同样的错误。您认为这是 pandas 中的一个范围界定错误?
  • @niczky12 - 是的,对我来说它在pandas 0.23.4 下工作,可能是版本相关的问题。
  • 哦,好的。我在0.23.1。感谢您的检查!
猜你喜欢
  • 2016-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-08
  • 1970-01-01
  • 2017-08-09
  • 1970-01-01
  • 2017-08-30
相关资源
最近更新 更多