【问题标题】:creating lists from text file using pandas in python在 python 中使用 pandas 从文本文件创建列表
【发布时间】: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 进行进一步计算
  • 正是...您不想为此使用列表!

标签: python python-2.7 python-3.x pandas


【解决方案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+")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-31
      • 1970-01-01
      • 2013-07-27
      • 1970-01-01
      • 2011-05-06
      相关资源
      最近更新 更多