panda在一个条件下将csv拆分为多个文件

7hiiyaii  于 2021-09-08  发布在  Java
关注(0)|答案(3)|浏览(268)

我有一个csv,看起来像这样:

'-'  'd'  '5'
'-'  'd'  '9'
'-'  'v'  '15'
'-'  's'  '8'
'-'  's'  '10'
'-'  'q'  '3'

我希望每次最后一列上的数字减少时分割 Dataframe ,并将其保存到新文件中。输出如下所示:
文件1:

'-'  'd'  '5'
'-'  'd'  '9'
'-'  'v'  '15'

文件2

'-'  's'  '8'
'-'  's'  '10'

文件3

'-'  'q'  '3'
rkue9o1l

rkue9o1l1#

为了简单起见,我将假设您的csv文件看起来像典型的csv文件:

-,d,5
-,d,9
...

我还假设最后一列中的数字总是正整数。

prev = 0
accumulatedLines = []
decreasedCount = 0
with open("my_file.txt", "r") as fin:
    for line in fin:
        values = line.split(",")
        if int(values[2]) < prev:
            with open("File{}.txt".format(decreasedCount + 1), "w") as fout:
                fout.writelines(accumulatedLines)
            decreasedCount += 1
            accumulatedLines = []

        accumulatedLines.append(line)
        prev = int(values[2])

本质上,我们迭代输入文件中的每一行,用逗号分隔符分隔,并跟踪上一行最后一列的值。我们还将读取的行累加到当前行。如果最后一列中的当前行的值严格小于前一行的值,我们将累积的行写入一个新文件(以迄今为止遇到递减值的次数命名)。然后清除累加器(并增加计数)。

ndh0cuux

ndh0cuux2#

使用 Series.shift 可以比较相邻的行。

from io import StringIO
import pandas as pd

s = """'-'  'd'  '5'
'-'  'd'  '9'
'-'  'v'  '15'
'-'  's'  '8'
'-'  's'  '10'
'-'  'q'  '3'""".replace("'", "")
df = pd.read_csv(StringIO(s), sep="\s\s+", engine="python", names=["a", "b", "c"])

# preserve the original column names

cols = df.columns

# create a grouping column

df["d"] = (df["c"].shift(fill_value=0) > df["c"]).cumsum()

# output each group

for name, group in df.groupby("d"):
    group[cols].to_csv(f"output_{name}.csv", index=False)

这就产生了这些群体:

a  b   c
0  -  d   5
1  -  d   9
2  -  v  15
-----------
   a  b   c
3  -  s   8
4  -  s  10
-----------
   a  b  c
5  -  q  3
-----------
iih3973s

iih3973s3#

阅读csv:

df = pd.read_csv(
    "your_file.txt",
    quotechar="'",
    quoting=1,
    sep=r"\s+",
    header=None,
)

打印组:

for _, g in df.groupby(df[2].diff().le(0).cumsum()):
    print(g.to_csv(index=None, quotechar="'", quoting=1, sep=" ", header=None))

注意:要写入文件,请将文件名添加到 .to_csv() . 如果没有文件名,它会将组写入屏幕。
印刷品:

'-' 'd' '5'
'-' 'd' '9'
'-' 'v' '15'

'-' 's' '8'
'-' 's' '10'

'-' 'q' '3'

相关问题