【问题标题】:Removing exceded pipes '|' in CSV after append files删除超出的管道“|”附加文件后在 CSV 中
【发布时间】:2021-07-22 07:18:18
【问题描述】:

我有 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

【问题讨论】:

  • 空列的附加管道是预期的,并且是 CSV 的标准。为什么要删除它们?
  • 因为我要加入 3 个具有特定 CSV 格式的表格,所以必须保持这些表格。并非所有列都显示在每个文件中,我需要保留原始管道格式。
  • 只是介绍一下,我不会处理这个最终数据,我需要以我提到的格式将其上传到特定的数据库。

标签: python pandas dataframe csv append


【解决方案1】:

如果你是这个意思,我认为你不能直接使用 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))

【讨论】:

  • 因为这些表可能会随着时间的推移而改变列,我不确定“字符串”解决方案是否足够灵活。但是您的解决方案很有趣,我会尝试应用它。谢谢
猜你喜欢
  • 1970-01-01
  • 2019-09-12
  • 2021-04-11
  • 1970-01-01
  • 2021-07-31
  • 2018-07-11
  • 1970-01-01
  • 2014-10-07
  • 1970-01-01
相关资源
最近更新 更多