我正在寻找以下问题的解决方案.
有一个DataFrame:
data = np.array([['', 'col1', 'col2'],
['row1', 1, 2],
['row2', 3, 4]])
df = pd.DataFrame(data=data[1:,1:], index=data[1:,0],columns=data[0,1:])
我希望保留行,例如,列col1中的值属于列表[1,2],而列col2中的值属于列表[2,4].
这是我认为会起作用的
df1 = df[df['col1'].isin([1,2]) & df['col2'].isin([2,4])]
但是df1打印为Empty DataFrame.
另一方面,这种方法
df1 = df[(df.col1 in [1,2]) & (df.col2 in [2,4])]
结果是
ValueError: The truth value of a Series is ambiguous. Use a.empty, `a.bool()`, `a.item()`, `a.any()` or `a.all()`.
期望在其中获得带有row1的DataFrame.
毋庸置疑,我对Python相对较新.非常感谢你的帮助.
最佳答案 您需要将数字系列转换为数字类型:
df = pd.DataFrame(data=data[1:,1:].astype(int),
index=data[1:,0],
columns=data[0,1:])
df1 = df[df['col1'].isin([1,2]) & df['col2'].isin([2,4])]
print(df1)
col1 col2
row1 1 2
您的代码不起作用,因为您的初始数据数组是object类型,表示指向任意类型的指针. Pandas不会隐含地应用转换,因为在大多数情况下这会非常昂贵.
如果您已经构建了Pandas数据帧,则可以将数值转换应用为单独的步骤:
df = df.astype(int)
或者,仅转换指定的系列:
cols = ['col1', 'col2']
df[cols] = df[cols].apply(pd.to_numeric, errors='coerce')