【问题标题】:Python - Lists - Formatting as tablePython - 列表 - 格式化为表格
【发布时间】:2017-03-02 00:35:53
【问题描述】:

我尝试将制表符分隔的表格读入列表数组。 我用过:

with open('/home/data.txt') as textFile:
    data = [line.split() for line in textFile] 

效果很好

打印给了我这个(添加换行符以提高可读性):

[('Col1', 'Col2', 'Col3', 'Col4'),
 ('A', 1, 2, 3),
 ('B', 4, 5, 6),
 ('C', 11, 22, 33),
 ('D', 44, 55, 66),
 ('E', 1, 2),
 ('F', 1, 2)]

对于最后两行,Col4 的值为空。

现在我的问题: 我想简单地创建一个基于列的列表,所以我只是做了一个 print(zip(*data)) 但是,这会完全省略第 4 列....

[('Col1', 'A', 'B', 'C', 'D', 'E', 'F'),
 ('Col2', 1, 4, 11, 44, 1, 1),
 ('Col3', 2, 5, 22, 55, 2, 2)]

我想要类似的东西:

[('Col1', 'A', 'B', 'C', 'D', 'E', 'F'),
 ('Col2', 1, 4, 11, 44, 1, 1),
 ('Col3', 2, 5, 22, 55, 2, 2),
 ('Col4', 3, 6, 33, 66)]

任何想法如何处理?

谢谢!

【问题讨论】:

  • 您请求的输出不一定可行 - 如果短行不在最后,由于缺少项目,您的列将不再排列。而不是zip(),尝试itertools.zip_longest() - 它用None(或fillvalue=参数指定的另一个值)填充短行。

标签: python python-3.x


【解决方案1】:

详述jasonharper's comment

import itertools
with open('/home/data.txt') as textFile:
    data = [line.split() for line in textFile]

transposed = list(itertools.zip_longest(*data))

现在如果你print(transposed) 你会得到:

Out[('Col1', 'A', 'B', 'C', 'D', 'E', 'F'), ('Col2', 1, 4, 11, 44, 1, 1),('Col3', 2, 5, 22, 55, 2, 2), ('Col4', 3, 6, 33, 66, None, None)]

如果您将可选的fillvalue 参数提供给itertools.zip_longest(),您将获得一些其他填充物。 list(itertools.zip_longest(*data, fillvalue='a') 会给你:

Out[('Col1', 'A', 'B', 'C', 'D', 'E', 'F'), ('Col2', 1, 4, 11, 44, 1, 1),('Col3', 2, 5, 22, 55, 2, 2), ('Col4', 3, 6, 33, 66, 'a', 'a')]

说,如果您正在使用更大的 csv 并且这是一个玩具示例,您可能需要考虑使用 pandas,因为这将使这种转置变得更简单:

import pandas as pd
df = pd.read_csv('/home/data.txt')

...会给你一个数据框对象:

  Col1   Col2   Col3   Col4
0    A      1      2    3.0
1    B      4      5    6.0
2    C     11     22   33.0
3    D     44     55   66.0
4    E      1      2    NaN
5    F      1      2    NaN

df.transpose() 然后会给你:

       0   1   2   3    4    5
Col1   A   B   C   D    E    F
Col2   1   4  11  44    1    1
Col3   2   5  22  55    2    2
Col4   3   6  33  66  NaN  NaN

【讨论】:

    猜你喜欢
    • 2015-01-20
    • 2016-12-26
    • 1970-01-01
    • 2018-06-13
    • 1970-01-01
    • 2013-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多