根据python中的值在csv文件中选择列

时间:2017-09-10 14:15:37

标签: pandas

我有一个项目编号列表如下。

item_numbers = [1,2,5]

我还有一个包含item_numbers成分的csv文件。

,sugar, protein, salt, oil
0, 0.2, 0.3, 0,   0
1, 0,    0,  0.2, 0.8
2, 0.4,  0,  0,   0

现在,我想获取列表中值大于零的项目的成分(如果值== 0,我不需要该成分)

E.g., item 1 in 'item_numbers' list -> [{'salt': 0.2}, {'oil': 0.8}]

我目前的代码如下。

df = pd.read_csv(ingredients, sep = ',')
df = df.iloc[:,1:]
df = df.loc[item_numbers].dropna(how='all').gt(0).apply(lambda x: x.index[x].tolist(), 1)
ingredients = df.values.tolist()
print(ingredients)

请帮帮我。

1 个答案:

答案 0 :(得分:1)

您可以使用:

df = df.loc[item_numbers].dropna(how='all').apply(lambda x: x[x > 0].to_dict(), 1)
ingredients = df.values.tolist()
print(ingredients)

[{'oil': 0.80000000000000004, 'salt': 0.20000000000000001}, {'sugar': 0.40000000000000002}]

要删除float precision numbers,可以使用:

  1. 将所有值转换为str
  2. df = df.loc[item_numbers].dropna(how='all').apply(lambda x:x[x > 0].astype(str).to_dict(), 1)
    
    ingredients = df.values.tolist()
    print(ingredients)
    [{'oil': '0.8', 'salt': '0.2'}, {'sugar': '0.4'}]
    
    1. 多个10100然后再划分:
    2. df = df.loc[item_numbers].dropna(how='all').mul(10).apply(lambda x: x[x > 0].to_dict(), 1)
      
      ingredients = df.values.tolist()
      print(ingredients)
      [{'oil': 8.0, 'salt': 2.0}, {'sugar': 4.0}]