删除超出的管道'|'附加文件后在 CSV 中

Removing exceded pipes '|' in CSV after append files

我有 3 个数据框。我需要将它们转换成一个合并的 CSV,用竖线“|”分隔。

我需要在附加后按 Column1 对它们进行排序。

但是,当我尝试将最终的 df 转换为 CSV 时,出现空列超出管道的情况。如何避免这种情况?

import pandas as pd
import io

df1 = pd.DataFrame({
    'Column1': ['key_1', 'key_2', 'key_3'],
    'Column2': ['1100', '1100', '1100']
})

df2 = pd.DataFrame({
    'Column1': ['key_1', 'key_2', 'key_3', 'key_1', 'key_2', 'key_3'],
    'Column2': ['1110', '1110', '1110', '1110', '1110', '1110'],
    'Column3': ['xxr', 'xxv', 'xxw', 'xxt', 'xxe', 'xxz'],
    'Column4': ['wer', 'cad', 'sder', 'dse', 'sdf', 'csd']
})

df3 = pd.DataFrame({
    'Column1': ['key_1', 'key_2', 'key_3', 'key_1', 'key_2', 'key_3'],
    'Column2': ['1115', '1115', '1115', '1115', '1115', '1115'],
    'Column3': ['xxr', 'xxv', 'xxw', 'xxt', 'xxe', 'xxz'],
    'Column4': ['wer', 'cad', 'sder', 'dse', 'sdf', 'csd'],
    'Column5': ['xxr', 'xxv', 'xxw', 'xxt', 'xxe', 'xxz'],
    'Column6': ['xxr', 'xxv', 'xxw', 'xxt', 'xxe', 'xxz'],
})

print(df1, df2, df3, sep="\n")

output = io.StringIO()

pd.concat([df1, df2, df3]).sort_values("Column1") \
  .to_csv(output, header=False, index=False, sep="|")

print("csv",output.getvalue(),sep="\n")

output.seek(0)

df4 = pd.read_csv(output, header=None, sep="|", keep_default_na=False)

print("df4",df4,sep="\n" )

output.close()

这是我的输出(注意管道'|'):

key_1|1100||||
key_1|1110|xxr|wer||
key_1|1110|xxt|dse||
key_1|1115|xxr|wer|xxr|xxr
key_1|1115|xxt|dse|xxt|xxt
key_2|1100||||
key_2|1110|xxv|cad||
key_2|1110|xxe|sdf||
key_2|1115|xxv|cad|xxv|xxv
key_2|1115|xxe|sdf|xxe|xxe
key_3|1100||||
key_3|1110|xxw|sder||
key_3|1110|xxz|csd||
key_3|1115|xxw|sder|xxw|xxw
key_3|1115|xxz|csd|xxz|xxz

但我需要这个而不使用正则表达式(注意管道'|'):

key_1|1100
key_1|1110|xxr|wer
key_1|1110|xxt|dse
key_1|1115|xxr|wer|xxr|xxr
key_1|1115|xxt|dse|xxt|xxt
key_2|1100
key_2|1110|xxv|cad
key_2|1110|xxe|sdf
key_2|1115|xxv|cad|xxv|xxv
key_2|1115|xxe|sdf|xxe|xxe
key_3|1100
key_3|1110|xxw|sder
key_3|1110|xxz|csd
key_3|1115|xxw|sder|xxw|xxw
key_3|1115|xxz|csd|xxz|xxz

我认为您不能直接使用 to_csv() 执行此操作,如果您是这个意思的话。

您可以使用 rstrip() 之类的内容重写 csv 输出。不确定“不使用正则表达式”是什么意思,但是 python 的 strip() 不使用正则表达式。

with io.StringIO() as output:
    pd.concat([df1, df2, df3]).sort_values('Column1') \
      .to_csv(output, header=False, index=False, sep='|')
    
    output.seek(0)
    lines = [line.rstrip('|\n') for line in output]
    
    print('\n'.join(lines))

输出:

key_1|1100
key_1|1110|xxr|wer
key_1|1110|xxt|dse
key_1|1115|xxr|wer|xxr|xxr
key_1|1115|xxt|dse|xxt|xxt
key_2|1100
key_2|1110|xxv|cad
key_2|1110|xxe|sdf
key_2|1115|xxv|cad|xxv|xxv
key_2|1115|xxe|sdf|xxe|xxe
key_3|1100
key_3|1110|xxw|sder
key_3|1110|xxz|csd
key_3|1115|xxw|sder|xxw|xxw
key_3|1115|xxz|csd|xxz|xxz

或使用真实文件:

output = 'output.csv'

pd.concat([df1, df2, df3]).sort_values('Column1') \
  .to_csv(output, header=False, index=False, sep='|')

with open(output, 'r') as f:
    lines = [line.rstrip('|\n') for line in f]

with open(output, 'w') as f:
    f.writelines('\n'.join(lines))