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

标签 python list pandas 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 打印为一个空 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

您的代码不起作用,因为您的初始 data 数组属于 object 类型,表示指向任意类型的指针。 Pandas 不会隐式应用转换,因为在大多数情况下这会非常昂贵。

如果您已经有一个构造好的 Pandas 数据框,您可以将数字转换作为一个单独的步骤应用:

df = df.astype(int)

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

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

关于Python DataFrame - 删除列值属于值列表的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50890405/

相关文章:

python - 如何从具有时间戳范围的 pandas 对象获取不同的组

java - java中递归地将字符串追加到字符串列表中

python - 从带有列表的列表中获取最大值?

python - 如果语句检查列表包含在不应该返回 true 时返回 true

python - 识别最小、最大列并将其转换为相对差异列

python - Wapiti 安全工具 : Getting "Invalid Syntax Error "

python - 我需要能够通过 USB 运行 pycharm + 模块

python - pandas 自定义工作日偏移量的性能

python - 在 Pandas 中使用 groupby、shift 和 rolling

Python Pandas 阅读