Python DataFrame - 删除具有属于值列表的列值的行

时间:2018-06-16 17:59:20

标签: python list pandas dataframe

我正在寻找以下问题的解决方案。 有一个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打印为空数据框。 另一方面,这种方法

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相对较新。非常感谢你的帮助。

2 个答案:

答案 0 :(得分:4)

您需要将数字系列转换为数字类型:

data

您的代码不起作用,因为您的初始object数组的类型为df = df.astype(int) ,表示指向任意类型的指针。熊猫不会隐含地应用转换,因为在大多数情况下这会非常昂贵。

如果已经拥有构建的Pandas数据帧,您可以将数字转换应用为单独的步骤:

cols = ['col1', 'col2']
df[cols] = df[cols].apply(pd.to_numeric, errors='coerce')

或者,仅转换指定的系列:

HttpClient

答案 1 :(得分:2)

您的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