【问题标题】:Loading CSV into dataframe results in all records becoming "NaN"将 CSV 加载到数据框中会导致所有记录变为“NaN”
【发布时间】:2021-04-15 13:03:00
【问题描述】:

我是 python 的新手(并且在 SO 上发帖),我正在尝试使用我编写的在另一个类似上下文中工作的一些代码将数据从文件导入 MySQL 表。为此,我需要将其转换为数据框。在这个特定的例子中,我使用的是由管道分隔的联邦选举委员会数据(它是“委员会主”数据here)。看起来像这样。

C00000059|HALLMARK CARDS PAC|SARAH MOE|2501 MCGEE|MD #500|堪萨斯城|MO|64108|U|Q|UNK|M|C|| C00000422|美国医学会政治行动委员会|WALKER, KEVIN MR.|25 MASSACHUSETTS AVE, NW|SUITE 600|WASHINGTON|DC|200017400|B|Q||M|M|ALABAMA MEDICAL PAC| C00000489|D R I V E 政治基金第 886 章|JERRY SIMS JR|3528 W RENO||俄克拉荷马城|OK|73107|U|N||Q|L|| C00000547|堪萨斯医学会政治行动委员会|杰瑞斯劳特|623 SW 10TH AVE||托皮卡|KS|666121627|U|Q|UNK|Q|M|堪萨斯医学会| C00000729|美国牙科协会政治行动委员会|DI VINCENZO, GIORGIO T. DR.|1111 14TH STREET, NW|SUITE 1100|WASHINGTON|DC|200055627|B|Q|UNK|M|M|INDIANA DENTAL PAC|

当我运行此代码时,所有记录都返回“NaN”。

import pandas as pd
import pymysql

print('convert CSV to dataframe')
data = pd.read_csv ('Desktop/Python/FECupdates/cm.txt', delimiter='|')
df = pd.DataFrame(data, columns=['CMTE_ID','CMTE_NM','TRES_NM','CMTE_ST1','CMTE_ST2','CMTE_CITY','CMTE_ST','CMTE_ZIP','CMTE_DSGN','CMTE_TP','CMTE_PTY_AFFILIATION','CMTE_FILING_FREQ','ORG_TP','CONNECTED_ORG_NM','CAND_ID'])

print(df.head(10))

如果我删除数据框部分并执行此操作,它会显示数据,所以看起来这不是文件本身的问题(但我知道什么?):

import pandas as pd
import pymysql
print('convert CSV to dataframe')
data = pd.read_csv ('Desktop/Python/FECupdates/cm.txt', delimiter='|')   
print(data.head(10))

我在这里花了几个小时查看似乎试图解决类似问题的不同问题——在这种情况下,问题显然源于编码或不同种类的分隔符之类的东西——但每次我尝试对我的代码进行相同的更改,我得到了相同的结果。我还通过将字段中的所有逗号更改为“$”,然后将管道更改为逗号,将整个内容转换为 csv。它仍然显示为“Nan”,即使我将它上传到 MySQL 时记录的数量是正确的(它们都是空的)。

【问题讨论】:

  • 做data = pd.read_csv()之后,data已经是一个dataframe了。

标签: python mysql pandas dataframe csv


【解决方案1】:

您在列列表中输入了拼写错误。 Pandas 可以自动识别列。

import pandas as pd
import pymysql

print('convert CSV to dataframe')
data = pd.read_csv ('cn.txt', delimiter='|')
df = pd.DataFrame(data)

print(df.head(10))

另外,您可以创建一个空数据框并连接读取的文件。

import pandas as pd
import pymysql

print('convert CSV to dataframe')
data = pd.read_csv ('cn.txt', delimiter='|')
data2 = pd.DataFrame()
df = pd.concat([data,data2],ignore_index=True)
print(df.head(10))

【讨论】:

  • 谢谢@dasmehdix!做到了!我知道这会很简单。数据已经没有标题,所以我添加了 header=None 并且允许我导入第一行。像魅力一样工作。再次感谢!
【解决方案2】:

试试这个,对我有用:

path = Desktop/Python/FECupdates
df = pd.read_csv(path+'cm.txt',encoding ='unicode_escape', sep='|')
df = df.apply(lambda x: x.str.strip() if x.dtype == "object" else x)

df.columns = ['CMTE_ID','CMTE_NM','TRES_NM','CMTE_ST1','CMTE_ST2','CMTE_CITY','CMTE_ST','CMTE_ZIP','CMTE_DSGN','CMTE_TP','CMTE_PTY_AFFILIATION','CMTE_FILING_FREQ','ORG_TP','CONNECTED_ORG_NM','CAND_ID']
df.head(200)

Output:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-04
    • 1970-01-01
    • 2018-09-16
    • 1970-01-01
    • 2015-09-16
    • 1970-01-01
    • 2023-03-03
    相关资源
    最近更新 更多