python - 基于字典的 Pandas 示例
问题描述
我正在尝试根据字典和特定列对 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]]))
yyxz
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
所以这可能是一个错误。
解决方案
我认为你需要.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
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
推荐阅读
- ios - 在我的代码中遇到 ObserveObject Array 更改的问题
- azure - 如何在 Azure 上创建新的构建代理来与我的私有 DNS 和 Azure DevOps 上的发布管道通信?
- r - 在带有分组数据的 tidyverse 框架中使用 PCA
- python - “conda env list”声称 env 不是有效的子命令
- python - 如何使用循环语句打印 1、3、7、15、31?
- python - Maya Python:制作 Playblast 并将其导出到我设置项目中的文件夹“movies”
- azure - 检查记录是否存在于 azure 逻辑应用程序内的 azure 表中
- nearprotocol - 使用未声明的类型或模块 near_blockchain
- python - Seaborn 不按顺序显示线图数据
- javascript - 复制粘贴文本区域行限制jquery