Python 根据标题读取文本文件切片列

Python 根据标题读取文本文件切片列,python,pandas,text,Python,Pandas,Text,设想一个如下所示的文本文件: Places Person Number Comments bar anastasia 75 very lazy home jimmy nothing to say beach 2 将第一行视为包含我希望用于数据帧的列名称的标题。你可以看到有空的单元格。还有一列包含带空格的字符串。该文件中

设想一个如下所示的文本文件:

Places       Person  Number         Comments
   bar    anastasia      75        very lazy
  home        jimmy           nothing to say
 beach                    2                 
将第一行视为包含我希望用于数据帧的列名称的标题。你可以看到有空的单元格。还有一列包含带空格的字符串。该文件中有一个可读模式,列之间至少有2个空格,从列名的端点到上一个列名的端点,每列的信息基本上可以是红色的。这一点没有含糊不清之处


如果我这样做

df = pd.read_csv('text_file.txt')
df = pd.read_csv('text_file.txt', delim_whitespace = True)
df = pd.read_csv('text_file.txt', sep = '\s{2,}', engine = 'python')
我将得到一个3 x 1的数据框,其中唯一的一列被称为
“Places Person Number Comments”
。因此,它无法理解表格格式


如果我这样做

df = pd.read_csv('text_file.txt')
df = pd.read_csv('text_file.txt', delim_whitespace = True)
df = pd.read_csv('text_file.txt', sep = '\s{2,}', engine = 'python')
它将创建大量的列,但无法理解
注释
中值中的空格,并将注释拆分并发送到不同的单元格,如下所示:

          Places   Person Number Comments
bar    anastasia       75   very     lazy
home       jimmy  nothing     to      say
beach          2      NaN    NaN      NaN

如果我这样做

df = pd.read_csv('text_file.txt')
df = pd.read_csv('text_file.txt', delim_whitespace = True)
df = pd.read_csv('text_file.txt', sep = '\s{2,}', engine = 'python')
它将理解,只有当有两个或更多的空间时,它才能被视为另一列的一部分。所以这是正确的。但它无法理解存在空单元格,并且会错误地将单元格从一列移到另一列

  Places     Person          Number   Comments
0    bar  anastasia              75  very lazy
1   home      jimmy  nothing to say       None
2  beach          2            None       None
现在我不知道该怎么办。在Pandas中有没有一种优雅的方法可以做到这一点?

您可以使用它将文件(一个具有固定宽度格式行的文件)读入数据帧

df = pd.read_fwf('text_file.txt')
演示 我使用StringIO作为演示。您可以使用实际文件名作为函数调用的参数

text = """
Places       Person  Number         Comments
   bar    anastasia      75        very lazy
  home        jimmy           nothing to say
 beach                    2                 
"""

from io import StringIO
df = pd.read_fwf(StringIO(text))

print(df)

  Places     Person  Number        Comments
0    bar  anastasia    75.0       very lazy
1   home      jimmy     NaN  nothing to say
2  beach        NaN     2.0             NaN