选择具有阈值pandas数据帧的值

时间:2018-01-19 13:12:42

标签: python pandas dataframe

我想列出每个索引的列= [0,43,46],这些值高于某个值,例如1000。

我的数据框看起来像这样但有更多列。

index           asset.assetStateId.10  asset.assetStateId.100  asset.assetStateId.101  \
0.0                  1057.0                     0.0                     0.0   
43.0                  380.0                  1441.0                     0.0   
46.0                    0.0                     0.0                  1441.0 

所以,最后,我希望有三个列表,列的名称每行的值大于1000。

提前致谢,

到目前为止我已经尝试了这个:

lista_colunas = list(result_1.columns.values)
lista_assets = []
for asset in lista_colunas:
    if result_1.loc[result_1[asset]>1000]:
        lista_assets += [asset]

ValueError:DataFrame的真值是不明确的。使用a.empty,a.bool(),a.item(),a.any()或a.all()。

2 个答案:

答案 0 :(得分:2)

我认为你可以创建dictionary of list s:

如有必要,首先按loc选择行,然后按stackreset_index重新整形:

idx  = [0,43,46] 
df = df.loc[idx].stack().reset_index(name='val')
print (df)    
   Index                 level_1     val
0      0   asset.assetStateId.10  1057.0
1      0  asset.assetStateId.100     0.0
2      0  asset.assetStateId.101     0.0
3     43   asset.assetStateId.10   380.0
4     43  asset.assetStateId.100  1441.0
5     43  asset.assetStateId.101     0.0
6     46   asset.assetStateId.10     0.0
7     46  asset.assetStateId.100     0.0
8     46  asset.assetStateId.101  1441.0

然后按boolean indexinggroupby过滤并创建list,最后转换为dict

a = df[df['val'] > 1000].groupby('index')['level_1'].apply(list).to_dict()

另一种解决方案是按行和按条件创建list s:

a = df.loc[idx].apply(lambda x: x.index[x > 1000].tolist(), axis=1).to_dict()

print (a)
{0.0: ['asset.assetStateId.10'], 
43.0: ['asset.assetStateId.100'], 
46.0: ['asset.assetStateId.101']}

print (a[0])
['asset.assetStateId.10']

print (a[43])
['asset.assetStateId.100']

答案 1 :(得分:1)

按值过滤列表的pythonic方法是list comprehension

[item for item in list if item >1000]

只保留大于1000的项目,但不会保留它们之间的空位。根据您希望如何组织程序,您可以(从数据框创建)执行以下结构:

for name, values in solution:
    name = [item for item in values if item>1000]

这也支持点查找,所以你可以这样做:

   [item.value for item in values if item.value>1000]

有很多方法可以过滤