如何读入Pandasthat已经被一个returnch打破了

2024-07-01 07:37:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图阅读一份人口普查报告,其中有几行如下所示。 有时,description字段太长,这会导致行中出现换行——这会使pandas陷入困境。在

533 45220 Tallahassee, FL                        1613     810     
999 13980 Blacksburg-Christiansburg-Radford,
  VA                                              543     455
108 11100 Amarillo, TX                            740     718 

下面的代码将把文件读入pandas中,但是很多行都被移位了。如何解析这样的文件文本文件?提前致谢。在

^{pr2}$

Tags: 文件代码pandas报告description人口普查tx移位
1条回答
网友
1楼 · 发布于 2024-07-01 07:37:01

熊猫将无法像这样将线路拼接在一起作为read_csv()的一部分。
我建议您先执行一次清理数据的操作(分隔符也是一个问题),然后再进行一次加载到Pandas中。在

首先,从URL获取数据(我使用requests,但是任何URL解析器都可以):

import pandas as pd
import re
import requests
url = "https://www.census.gov/construction/bps/txt/tb3v2016.txt"
r = requests.get(url)

现在迭代行,将每一行写入lines。在

^{pr2}$

以上区块注释:

  • 因为我们要用\s+分隔符将这个表读入Pandas,所以如果空格不是列分隔符的一部分,就用_替换它们。我们要特别寻找其中两种边缘情况:
    • 例如Alexandria, LA>;Alexandria,_LA
    • 例如Minneapolis-St. Paul-Bloomington>;Minneapolis-St._Paul-Bloomington
  • 如果一行看起来很有趣(意味着它不是以数字CSA代码开头的),那么假设它实际上是该行前面的一部分,并将其添加到前一行中。在
  • 我们需要跟踪lines的索引,它表示我们要添加到的上一行。每次我们迭代原始数据的一行而不向lines添加新行时,循环计数器(i)与lines中最后一个元素的索引之间的差值将增加1。所以我们使用一个计数器(backup_by)来计算出要附加到的lines的正确索引。在

现在将清理后的文本文件读入Pandas:

colnames = ["CSA", "CBSA", "Name", "Total", "1 Unit", "2 Units", 
            "3 and 4 Units", "5 Units or more"]
df = pd.read_table(fname, header=None, names=colnames, encoding="ISO-8859-1", 
                   engine='python', delim_whitespace=True, skipfooter=3)

df.head()
   CSA   CBSA                          Name   Total  1 Unit  2 Units  \
0  999  10180                   Abilene,_TX   55593   55193      400   
1  184  10420                     Akron,_OH  226669  226169        0   
2  999  10500                    Albany,_GA   28679   23686        0   
3  440  10540                    Albany,_OR   98763   97926        0   
4  104  10580  Albany-Schenectady-Troy,*_NY  512058  361454    10605   

   3 and 4 Units  5 Units or more  
0              0                0  
1            500                0  
2            360             4633  
3              0              837  
4          26585           113414  

此时,如果需要,可以返回并删除插入Name字段中的空格的_占位符。在

相关问题 更多 >

    热门问题