将csv文件数据导入pandas数据框时出错

时间:2020-06-04 15:04:34

标签: python-3.x pandas

我碰到一堵砖墙,试图清理导入的CSV,希望有人能帮忙吗?

我已经导入了30000行x68列的CSV文件:

df = pd.read_csv("training_dataCSV",low_memory=False)

数据如下:

ID  PP1.1   PP2.1   PP3.1   KF1.1   KF2.1   KF3.1   KF4.1   KF5.1   KF6.1   ...     BLOSUM5.1   BLOSUM6.1   BLOSUM7.1   BLOSUM8.1   BLOSUM9.1   BLOSUM10.1  MSWHIM1.1   MSWHIM2.1   MSWHIM3.1   Class
1   YMPLLGIIGLVTSFS     -0.552666667    -0.279333333    0.022666667     0.087333333     -0.366666667    0.322666667     -0.504  0.036666667     -0.546  ...     -0.270666667    0.249333333     0.223333333     -0.082666667    0.004   -0.015333333    -0.482666667    0.624   -0.491333333    Negative

首先,所有内容似乎都作为对象导入,所以我的第一个任务是将数据分成3个数据帧,这样我就可以将第一个转换为字符串,第二个转换为float,第三个转换为字符串,然后重新组合。

df1 = df_temp["ID"]
df2 = df_temp.iloc[:,1:-1].copy()
df3 = df_temp["Class"]

但是,当使用df1df1["PP1.1"] = df1["PP1.1"].astype(str)转换为字符串时,我只是得到一个对象。

当我尝试使用df2 = df2.apply(pd.to_numeric)将df2列转换为浮点数时,出现错误,提示ValueError: Unable to parse string "?" at position 7204

如果有人知道导入数据的最佳方法,请告诉我。我的目标是最终得到一个数据帧,其中第一列和最后一列是字符串,中间列是浮点数。如果有任何空白单元格,我想替换为NaN。对于上述(行7204),我手动检查了csv文件,其编号为-0.159333333,但是由于某些原因,df2['PP1.1'][7204]给了我:'?'

很奇怪!我不知道数据是怎么回事!如果有帮助,则在excel中打开时,csv中的所有数据均为“常规”格式。

谢谢。

编辑:按要求添加: `

df.dtypes

ID            object
PP1.1         object
PP2.1         object
PP3.1         object
KF1.1         object
               ...  
BLOSUM10.1    object
MSWHIM1.1     object
MSWHIM2.1     object
MSWHIM3.1     object
Class         object
Length: 68, dtype: object`

2 个答案:

答案 0 :(得分:0)

我想出了办法:

df = pd.read_csv("training_dataCSV.csv",low_memory=False)
df1 = df['ID'].astype("string")
df2 = df.iloc[:,1:-1].copy()
df3 = df['Class'].astype("string")

#convert the main blocks to float
cols = df.drop(['ID','Class'], axis = 1)
for i in cols:
    df2[i] = df2[i].apply(pd.to_numeric, errors = 'coerce')

我不确定for循环。有人可以建议这是否是将数据框中的列转换为数据类型float的正确方法吗?

我注意到的另一件事是.astype("string")有效,但.astype(str)无效。有人知道为什么是这样吗?仅仅是因为str必须放在括号中?

谢谢!

答案 1 :(得分:0)

您可以使用字典将所需的数据类型指定给read_csv函数,该字典将“ .csv”文件中包含的每个列名映射为所需的类型。例如,如果您希望ID为整数,请尝试以下操作:

import pandas as pd
df = pd.read_csv("training_dataCSV", low_memory=False, dtype={'ID': int})
print(df.dtypes)

,输出应该是这样的:

ID            int64
PP1.1         object
PP2.1         object
PP3.1         object
KF1.1         object
               ...  
BLOSUM10.1    object
MSWHIM1.1     object
MSWHIM2.1     object
MSWHIM3.1     object
Class         object

编辑: 要使用上述方法,您将需要熊猫版本为1.01.0或更高版本。

编辑2: 对于我来说,您建议的转换方式似乎是正确的,只是您实际上并不需要创建另一个变量来将转换后的元素保存到其中。因此,如果您要在从磁盘读取数据后手动转换数据,请尝试以下操作:

import pandas as pd
# read your data
df = pd.read_csv("training_dataCSV",low_memory=False)

# manually convert columns
df['ID'] = df['ID'].astype(int)
# and so on...

无论如何,我相信我建议的第一种方法会更好。

编辑3: 正如您在最后一条评论中进一步提出的那样,这是另一种解决方案,该解决方案不会在无法转换的类型上引发异常:

import pandas as pd
# read your data
df = pd.read_csv("training_dataCSV",low_memory=False)

# convert column by column
df['ID'] = pd.to_numeric(df['ID'], errors='coerce')
# and so on...