Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 基于字典的熊猫示例_Python_Pandas_Sample_Keyerror - Fatal编程技术网

Python 基于字典的熊猫示例

Python 基于字典的熊猫示例,python,pandas,sample,keyerror,Python,Pandas,Sample,Keyerror,我正在尝试对基于字典和特定列的pandas数据帧进行采样。因此,对于y列的每个值,我确切地知道我想要选取多少个观察值 我可以通过groupbyapply组合执行此操作,如下所示: 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

我正在尝试对基于字典和特定列的pandas数据帧进行采样。因此,对于
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 x z

02 01 2 4 0 1 2 1 5 1 1 2 2002112

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

df.groupby('y').apply(lambda x: x.sample(sizes[x.y.unique()[0]]))
有人能解释为什么会这样吗

编辑:


这发生在
0.23.1
上,但不是在
0.23.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
如果可能,字典中的某些值不匹配,请将
get
0
用于不匹配的值:

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


您正在按
y
进行分组,然后再次采用
y
的唯一性?每个迭代x都按
y
对对象进行分组。您认为
df.groupby('y').apply(lambda x:x.sample(大小[df.y.unique()[0]])吗
x.name
更优雅,我不知道。但为什么另一个给我一个错误?@niczky12-添加到解决方案中-用于调试的是创建函数
f
lambda func
相同,所以
df.groupby('y')。应用(lambda x:x.sample(大小[x.y.unique()[0]]))
应该可以工作,对吗?但我仍然会遇到同样的错误。你确认这是熊猫中的一个范围错误吗?@niczky12-是的,对我来说它在
pandas 0.23.4
下工作,可能是版本相关的问题。哦,好的。我在
0.23.1
上。谢谢检查!
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