我有一个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'
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])
本质上,我们迭代输入文件中的每一行,用逗号分隔符分隔,并跟踪上一行最后一列的值。我们还将读取的行累加到当前行。如果最后一列中的当前行的值严格小于前一行的值,我们将累积的行写入一个新文件(以迄今为止遇到递减值的次数命名)。然后清除累加器(并增加计数)。
ndh0cuux2#
使用 Series.shift 可以比较相邻的行。
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 -----------
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() . 如果没有文件名,它会将组写入屏幕。印刷品:
.to_csv()
3条答案
按热度按时间rkue9o1l1#
为了简单起见,我将假设您的csv文件看起来像典型的csv文件:
我还假设最后一列中的数字总是正整数。
本质上,我们迭代输入文件中的每一行,用逗号分隔符分隔,并跟踪上一行最后一列的值。我们还将读取的行累加到当前行。如果最后一列中的当前行的值严格小于前一行的值,我们将累积的行写入一个新文件(以迄今为止遇到递减值的次数命名)。然后清除累加器(并增加计数)。
ndh0cuux2#
使用
Series.shift
可以比较相邻的行。这就产生了这些群体:
iih3973s3#
阅读csv:
打印组:
注意:要写入文件,请将文件名添加到
.to_csv()
. 如果没有文件名,它会将组写入屏幕。印刷品: