为了账号安全,请及时绑定邮箱和手机立即绑定

将观测值表示为字典,并基于一个键和值集进行过滤

将观测值表示为字典,并基于一个键和值集进行过滤

狐的传说 2021-03-04 10:06:18
我有一个数据集(在一个文件中),它由具有各种属性(列)的多个观察值(行)组成。例如:AttrA   AttrB   AttrC 1       12      'a' 2       43      'd' 3       23      'f' 4       25      'z' 我将此数据集放入python字典中,使得:data = {'AttrA':[1,2,3,4],'AttrB':[12,43,23,25],'AttrC':['a','d','f','z']}我希望能够基于其中一个键的标准来过滤观察值。举些例子。过滤对AttrA> = 3的观察,例如: AttrA   AttrB   AttrC 3       23      'f' 4       25      'z' 或者reducedData = {'AttrA':[3,4],'AttrB':[23,25],'AttrC':['f','z']}看来您可以执行以下操作:reduceddata = {(k,v) for k,v in data if (??)},但是我不确定if语句之后会发生什么。另外,字典是否是此示例中使用的最佳数据类型?如果数据在嵌套列表中,则似乎更容易过滤。
查看完整描述

3 回答

?
素胚勾勒不出你

TA贡献1827条经验 获得超9个赞

我将首先更改结构:


table = [dict(zip(data.keys(), row)) for row in zip(*data.values())]

它看起来像这样:


[{'AttrA': 1, 'AttrB': 12, 'AttrC': 'a'},

 {'AttrA': 2, 'AttrB': 43, 'AttrC': 'd'},

 {'AttrA': 3, 'AttrB': 23, 'AttrC': 'f'},

 {'AttrA': 4, 'AttrB': 25, 'AttrC': 'z'}]

现在,您可以完全按照您的描述进行过滤:


[row for row in table if row['AttrA'] >= 3]


查看完整回答
反对 回复 2021-03-29
?
拉风的咖菲猫

TA贡献1995条经验 获得超2个赞

def my_filter(data,attr,val):

    ind = [i for i,x in enumerate(data[attr]) if x >= val]

    reducedData  = {k: [v[i] for i in ind] for k,v in data.items()}

    return reducedData 


data = {'AttrA':[1,2,3,4],'AttrB':[12,43,23,25],'AttrC':['a','d','f','z']}


print my_filter(data, 'AttrA',3)

输出:


{'AttrB': [23, 25], 'AttrC': ['f', 'z'], 'AttrA': [3, 4]}


查看完整回答
反对 回复 2021-03-29
?
DIEA

TA贡献1820条经验 获得超2个赞

我想我会选择:


data = [(12, 'a'), (43, 'd'), (23, 'f'), (25, 'z')]

data_dic = dict(enumerate(data, 1))

reducedData = {k:v for k, v in data_dic if k >= 3}


查看完整回答
反对 回复 2021-03-29
  • 3 回答
  • 0 关注
  • 218 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号