在 python 中使用 pandas 从文本文件创建列表

Posted

技术标签:

【中文标题】在 python 中使用 pandas 从文本文件创建列表【英文标题】:creating lists from text file using pandas in python 【发布时间】:2013-06-08 02:26:17 【问题描述】:

我有一个如下的文本文件 (data.txt):

name height  weight
    A   15.5    55.7
    B   18.9    51.6
    C   17.4    67.3
    D   11.4    34.5
    E   23.4    92.1

我想在 python 中使用 pandas 为每一列创建列表。

import pandas
with open (pandas.read_csv('data.txt')) as df:
    name= df.icol(0)
    height= df.icol(1)
    weight= df.icol(2)
    print (name)
    print (height)
    print (weight)

我还想避免列表中的标题(姓名、身高、体重)。

print(df)提供如下:

name\theight\tweight
0        A\t15.5\t55.7
1        B\t18.9\t51.6
2        C\t17.4\t67.3
3        D\t11.4\t34.5
4        E\t23.4\t92.1

【问题讨论】:

您不是用名为 lisa 的帐户问过同样的问题吗? read_csv 默认情况下需要逗号,而不是制表符,因此它无法将您的数据解析为列。使用read_csv('data.txt', delim_whitespace=True) 重试。 但是...为什么你想要这些列表?? @andy 进行进一步计算 正是...您不想为此使用列表! 【参考方案1】:

不清楚为什么要使用 pandas,因为你还没有说明为什么要将它们专门放在一个列表中,所以这里有一个使用 csv 的解决方案:

import csv

with open('data.txt') as f:
    reader = csv.DictReader(f, delimiter='\t')
    rows = list(reader)

现在rows 是一个字典列表,每个字典都有一个代表您的行的标题;获取您的每一列:

names = [i['name'] for i in rows]
heights = [float(i['height']) if i['height'] else 0.0 for i in rows]
weights = [float(i['weight']) if i['weight'] else 0.0 for i in rows]

【讨论】:

@burhan 实际上,我想使用 pandas 的思维来简化程序。但熊猫并没有像我想象的那样工作。所以现在也在考虑你的解决方案。 最好寻求问题的帮助,而不是问题的解决方案。这通常被称为XY problem @burhan 我的代码 Traceback 出错(最近一次调用最后一次):文件“E:\PYTHON\test.py”,第 3 行,在 reader = csv.DictReader(delimiter ='\t') TypeError: __init__() 至少需要 2 个参数(给定 1 个) 身高和体重的列表仍然是字符串,想要进入浮点数 查看更新后的答案。我为高度和重量添加了一个默认值 0.0,以防它们在文件中为空白(否则你会得到一个 TypeError 异常)。【参考方案2】:

试试这样的:

import pandas
df = pandas.read_csv('data.txt')
# Assuming there's a columns with the headers 'name', 'height', 'weight'
name = list(df['name'])
height = list(df['height'])
weight = list(df['weight'])
print name
print height
print weight

在使用this example 并查看read_csv 的文档后,这可能会起作用

如果你想让标题更有活力,你可以这样做

for k in df.keys():
    l = list(df[k])
    print l

它将遍历所有列并为它们创建列表。

【讨论】:

【参考方案3】:

要将 Series(例如,DataFrame 的列)转换为不带标题的普通 Python 值列表,请使用 Series 方法 tolist()

In [9]: df
Out[9]: 
  name  height  weight
0    A    15.5    55.7
1    B    18.9    51.6
2    C    17.4    67.3
3    D    11.4    34.5
4    E    23.4    92.1

In [10]: name, height, weight = [df[col].tolist() for col in df]

In [11]: name
Out[11]: ['A', 'B', 'C', 'D', 'E']

等等。

【讨论】:

我的 df 输出看起来像你上面的,但是当我尝试 df['name'].tolist() 时,我收到了 KeyError: u'no item named name' 消息。 您能准确地发布df 的输出吗?我怀疑你的列名没有正确加载。 是的,安迪就在这里。查看pandas documentation 了解更多信息。 df = pandas.read_csv("pandas_test.txt", sep=r"\s+") 用于处理示例文件中的前导空格。【参考方案4】:

由于上面的示例文本文件在第一列有前导空格,因此必须使用以下内容来防止错误的表导入:

df = pandas.read_csv("pandas_test.txt", sep=r"\s+")

【讨论】:

以上是关于在 python 中使用 pandas 从文本文件创建列表的主要内容,如果未能解决你的问题,请参考以下文章

用于各种日期的 Python/Pandas 正则表达式 [重复]

python3 - 从文本文件格式导入数据帧head1 = value | head2 = value

Pandas python合并多个文件文本

我们应该使用 pandas.compat.StringIO 还是 Python 2/3 StringIO?

使用 Pandas 读取大型文本文件 [重复]

Python:当文件在列标题中有特殊字符时,使用 Pandas 读取 Excel 文件