我正在寻找以下问题的解决方案。 有一个数据帧:
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
打印为空数据帧。 另一方面,这种方法
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 的数据帧。 不用说,我对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
您的代码不起作用,因为您的初始data
数组属于object
类型,表示指向任意类型的指针。Pandas 不会隐式应用转换,因为在大多数情况下,这将非常昂贵。
如果您已经有一个构造的 Pandas 数据帧,则可以将数字转换作为单独的步骤应用:
df = df.astype(int)
或者,要仅转换指定的系列:
cols = ['col1', 'col2']
df[cols] = df[cols].apply(pd.to_numeric, errors='coerce')
你的 colunm 类型是object
,因为你使用np.array
创建数据,np.array
只允许每个数组中的单个dtype
df.applymap(type)
Out[139]:
col1 col2
row1 <class 'str'> <class 'str'>
row2 <class 'str'> <class 'str'>
使用这种方式创建
df = pd.DataFrame(data=[[1,2],[3,4]], index=['row1','row2'],columns=['col1','col2'])
df[(df['col1'].isin([1,2])) & (df['col2'].isin([2,4]))]
Out[143]:
col1 col2
row1 1 2