我有一个 CSV 文件,我想对其进行规范化以用于 SQL 输入。我想删除每一行,其中列数不等于行内的某个数字,这样我可以忽略可能发生列移位的坏行。过去,我使用 AWK 来标准化这个 CSV 数据集,但我想用 Python 实现这个程序,以便比 GNU Parallel + AWK 解决方案更容易并行化。
我尝试使用以下代码来删除行:
df.drop(df[df.count(axis='columns') != len(usecols)].index, inplace=True)
df = df[df.count(axis=1) == len(usecols)]
df = df[len(df.index) == len(usecols)]
这些都不起作用,我需要一些帮助,谢谢!
编辑:
- 我正在由一名工作人员处理单个 CSV 文件。
编辑2:
这是供引用的 awk 脚本:
{
line = $0;
# ...
if (line ~ /^$/) next; # if line is blank, then remove it
if (NF != 13) next; # if column count is not equal to 13, then remove it
}
最佳答案
这个问题不太好理解。从第一条语句来看,您似乎正在使用单个文件,这是正确的吗?
如果是这样,如果有未命名的列,那么 pandas
(或通过 pandas
的 dask
)将尝试“修复” ' 通过添加缺少的列标签(例如“无标题:0”)来调整结构。一旦发生这种情况,可以使用以下方法轻松删除未对齐的行:
mask = df['Untitled: 0'].isna()
df = df[mask]
编辑:如果某些行包含的条目多于定义的列数,pandas
将引发错误,表示无法解析 csv。
但是,如果您正在处理多个 csv 文件,则一种选择是使用 dask.delayed
强制兼容列,请参阅 this answer以获得进一步的指导。
关于python - 从 Dask DataFrame 中删除列数不相等的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74269282/