0

我收到了一个包含购买数据的 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 个逗号,那么我将使用正则表达式将该逗号周围的数据替换为“ . ”而不是“ ,

4

2 回答 2

2

如果您确定它只是存在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)
于 2019-09-20T08:04:24.913 回答
0

我会这样做,当我尝试复制您的问题时,我有以下 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)
于 2019-09-20T08:06:05.503 回答