Pandas 在python的csv文件中仅选择有限列

Pandas 在python的csv文件中仅选择有限列,pandas,Pandas,我有一个项目编号清单如下 item_numbers = [1,2,5] 我还有一个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,我不需要该成分) 是否可以使用pandas执行此操作?您可以首先选择行,然后使用NaNby删除可能添加的行,并与0by进行比较。最后使用列表应用

我有一个项目编号清单如下

item_numbers = [1,2,5]
我还有一个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,我不需要该成分)


是否可以使用pandas执行此操作?

您可以首先选择行,然后使用
NaN
by删除可能添加的行,并与
0
by进行比较。最后使用列表
应用

df = df.loc[item_numbers].dropna(how='all').gt(0).apply(lambda x: x.index[x].tolist(), 1)
print (df)
1    [salt, oil]
2        [sugar]
dtype: object
如果要将值与
合并:

df = df.loc[item_numbers].dropna(how='all').gt(0)
s = np.where(df, ['{}, '.format(x) for x in df.columns], '')
out = pd.Series([''.join(x).strip(', ') for x in s], index=df.index)
print (out)
1    salt, oil
2        sugar
dtype: object


因此,对于每一行,您需要一个列名称列表,其中值>0?您想对输出做什么?将它另存为一个新列?我认为最简单的方法是使用
out=pd.DataFrame({'col':[''.join(x).strip('',')for x in s]},index=df.index)
然后
out.to_csv('myfile.csv',index=False)
如果需要,还可以使用第一列
out.to_csv('myfile.csv')
谢谢您的回答。但是,我得到了以下错误。请让我知道如何纠正它。TypeError:无法在“numpy.ndarray”和“int”实例之间使用不支持的块值“>”操作0。我认为问题在于您的数据不是
浮动的,而是
str
。在我的解决方案之前,请使用
df=df.iloc[:,1:
来忽略第一列。
df = df.loc[item_numbers].dropna(how='all').gt(0)
s = np.where(df, ['{}, '.format(x) for x in df.columns], '')
out = pd.Series([''.join(x).strip(', ') for x in s], index=df.index)
print (out)
1    salt, oil
2        sugar
dtype: object
print (df.dtypes)
sugar      float64
protein    float64
salt       float64
oil        float64
dtype: object