如何防止 pandas read_csv 在 DataFrame 的一行中对相同的值进行编号?

问题描述 投票:0回答:1

我刚刚遇到了一些似乎在 python 论坛或任何教程中都没有讨论过的问题。至少我找不到任何解释。

我想使用 Python/pandas 逐行读取 csv 文件并将这些行写入(附加)到另一个 csv 文件。
不要想知道我为什么这样做:我想逐行修改一个非常大的 csv 文件(行号>> 10000),并且如果需要的话还必须插入额外的新行...

这是我的最小示例,它可以说明我的意思:

import csv
import pandas as pd

# get total number of rows
file_content = pd.read_csv('test_read.csv')
row_count = len(file_content)

i = 0
while i <= row_count:
    # read DataFrame with single line from input file
    df = pd.read_csv('test_read.csv', skiprows=lambda x: x!=i, sep=';', quoting=csv.QUOTE_NONE)
    # write DataFrame to output file
    df.to_csv('test_out.csv', mode='a', sep=';', index=False, quoting=csv.QUOTE_NONE)
    i = i + 1

输入文件“test_read.csv”的内容,如Notepad++所示:

“位置 1”;“96”;“0”;“0”;“ABCDEF”;“5.67”;“0.0”;“ABCDEF”;“0”;“0”
"位置 2";"34";"0";"0";"GHIJKL";"5.53";"0.0";"OPQRST";"0";"0"

运行Python代码后,输出文件“test_out.csv”包含:

"位置 1";"96";"0";"0".1;"ABCDEF";"5.67";"0.0";"ABCDEF".1;"0".2;"0".3
"位置 2";"34";"0";"0".1;"GHIJKL";"5.53";"0.0";"OPQRST";"0".2;"0".3

可以看出,除了第一个之外,每行中的四个重复出现的“0”值都附加了某种索引号.1.2.3。与第一行中的“ABCDEF”字符串相同。所有其他人不受影响。

当我在读取 DataFrame df 时删除

skiprows=lambda x: x!=i
时,这种重复字符串的“编号”根本不会发生。

读取一个 DataFrame 中的多行时,只有每个 DataFrame 的第一行受此“编号”影响:

"位置 1";"96";"0";"0".1;"ABCDEF";"5.67";"0.0";"ABCDEF".1;"0".2;"0".3
"位置 2";"34";"0";"0";"GHIJKL";"5.53";"0.0";"OPQRST";"0";"0"
"位置 3";"27";"0";"0";"GHIJKL";"4.12";"0.0";"GHIJKL";"0";"0"
"位置 4";"49";"0";"0".1;"GHIJKL";"3.89";"0.0";"OPQRST";"0".2;"0".3
"位置 5";"71";"0";"0";"KLMNOP";"4.40";"0.0";"KLMNOP";"0";"0"
"位置 6";"52";"0";"0";"STUVWX";"6.72";"0.0";"STUVWX";"0";"0"

在这个 6 行示例中,我更改为

skiprows=lambda x: x not in [i, i+1, i+2]
i = i + 3
以读取每个 DataFrame 3 行。仅第一行和第四行受到影响。

我认为这可能来自我对

skiprows
的使用。是否有另一种方法可以逐行读取 csv 文件(使用 pandas),这可能显示这种“编号”行为?

输出文件应由另一个软件读取,该软件拒绝读取它,包括附加的“数字”。 非常感谢任何帮助摆脱它们的帮助......

python-3.x pandas dataframe csv
1个回答
0
投票

如果我理解正确的话,你需要在读取/写入 CSV 时添加

header=None
参数:

import csv

import pandas as pd

# get total number of rows
file_content = pd.read_csv("test_read.csv")
row_count = len(file_content)

i = 0
while i <= row_count:
    # read DataFrame with single line from input file
    df = pd.read_csv(
        "test_read.csv", skiprows=lambda x: x != i, sep=";", quoting=csv.QUOTE_NONE, header=None
    )
    # write DataFrame to output file
    df.to_csv("test_out.csv", mode="a", sep=";", index=False, header=None, quoting=csv.QUOTE_NONE)
    i = i + 1

然后输出文件包含:

"Pos 1";"96";"0";"0";"ABCDEF";"5.67";"0.0";"ABCDEF";"0";"0"
"Pos 2";"34";"0";"0";"GHIJKL";"5.53";"0.0";"OPQRST";"0";"0"
© www.soinside.com 2019 - 2024. All rights reserved.