2017-09-10 4 views
1

다음과 같이 항목 번호 목록이 있습니다.파이썬의 값을 기반으로 csv 파일에서 열을 선택하십시오.

item_numbers = [1,2,5] 

또한 item_numbers의 구성 요소가 포함 된 csv 파일이 있습니다. 값이 0보다 큰 (값 == 0, 내가 그 재료가 필요하지 않은 경우)

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

입니다

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

지금, 내 목록의 항목에 대한 성분을 얻으려면 현재 코드는 다음과 같습니다.

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

당신은 사용할 수 있습니다

  1. 변환 모든 값 str에 :
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'}] 
    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 제거 가능한 사용하는 것입니다 "> 10, 100 다음 다시 분할에 의해

  1. 여러 : 매우 유용한 답변에 대한
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}] 
+0

많은 감사합니다. 그러나, 나는 0.8 대신에 0.80000000000000004를 얻는다. 그것을 고치는 방법을 알고 있습니까? –

+1

흠, 이것은 실제'float's입니다. [this] (https://stackoverflow.com/a/39901954/2901002)를 참조하십시오. 다음 공정의 출력에 문제가 있습니까? – jezrael

+0

감사! 예, 저는 실제로 진정한 가치를 원합니다. 그러나 내 수레는 소수점 이하 3 자리까지만 가질 수 있습니다 (예 : 0.333). 따라서 소수점 3 자리까지 반올림하면 해결 될까요? –

관련 문제