我想列出每个索引的列= [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()。
答案 0 :(得分:2)
我认为你可以创建dictionary of list
s:
如有必要,首先按loc
选择行,然后按stack
和reset_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 indexing
,groupby
过滤并创建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]
有很多方法可以过滤