簡體   English   中英

刪除超出的管道“|” 在 append 文件之后的 CSV

[英]Removing exceded pipes '|' in CSV after append files

我有 3 個數據框。 我需要將它們轉換為一個合並的 CSV 由管道“|”分隔。

我需要在 append 之后按 Column1 對它們進行排序。

但是,當我嘗試將最終的 df 轉換為 CSV 時,null 列的管道超出了。 如何避免這種情況?

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()

這是我擁有的 output(注意管道'|'):

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 output 。 不確定“不使用正則表達式”是什么意思,但 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))

Output:

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))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM