Исправление данных в CSV-файле - PullRequest
0 голосов
/ 20 сентября 2019

Мне дали csv-файл с данными о покупке, но у него есть проблема: у него есть 4 столбца, все разделены запятыми, но в одном столбце с ценой есть много значений с запятой, используемой в качестве десятичного разделителя.Таким образом, в конце концов, когда я пытаюсь прочитать файл, он читает эти строки как имеющие 5 столбцов и сталкивается с ошибкой.Примерно так:

transaction id,user id,purchase price,purchase date
1009497,490408,10,41674
1077573,490408,8,95,41676

Итак, pd.read_csv может читать метки, читать первую строку, но останавливается на второй строке, потому что думает, что я даю ему 5 столбцов вместо 4.Какой самый эффективный способ исправить мои данные?Невозможно вручную изменить все десятичные разделители с запятой на точку.

ОБНОВЛЕНИЕ: я думаю о том, чтобы прочитать каждую строку как строку, а затем подсчитать запятые в каждой строке, и если в ней 4 запятых, я бы использовал регулярное выражениевзять замену данных вокруг запятой как ". " вместо ", "

Ответы [ 2 ]

2 голосов
/ 20 сентября 2019

Если вы уверены, что это только поле purchase price с этой проблемой, вы можете сделать следующее, хотя, если ваш файл большой, это займет некоторое время, но это работает:

import pandas as pd

with open('your_csv.csv', 'r') as f:
    file_text = f.readlines()

with open('your_csv.csv', 'w') as f:
    for line in file_text:
        if len(line.split(',')) > 4:
            line = '%s,%s,%s.%s,%s' % tuple([i for i in line.split(',')])
        f.write(line)

csv = pd.read_csv('your_csv.csv')
print(csv)
0 голосов
/ 20 сентября 2019

Я бы сделал так, когда я пытаюсь повторить вашу проблему, у меня есть следующий DF:

   transaction id  user id  purchase price  purchase date Unnamed: 4
0         1009497   490408              10          41674        nan
1         1077573   490408               8             95    41676.0

# So basically I get a new column " Unnamed:4" 

df['Unnamed: 4'] = df['Unnamed: 4'].astype(str) # Convert to string..... 
df['purchase date'] = df['purchase date'].astype(str)


df.loc[df['Unnamed: 4'] != 'nan', 'purchase price'] = df['purchase price'].astype(str) + '.' + df['purchase date'] # When it's not nan, will merge with the purchase price


df.loc[df['Unnamed: 4'] != 'nan', 'purchase date'] = df['Unnamed: 4'].str.split('.').str[0] # When it's not nan, will reassign the purchase date

#Just drop the last column....

df.drop(columns=['Unnamed: 4'])

# You can return the purchase price to float 

df['purchase price'] = df['purchase price'].astype(float)
...