【问题标题】:Trying to rearrange two dimensional list into a different two dimensional list试图将二维列表重新排列为不同的二维列表
【发布时间】:2014-06-03 08:04:42
【问题描述】:

给定这样的输入:

"Date 3" "Location A" "some data" 
"Date 3" "Location B" "some data" 
"Date 3" "Location C" "some data" 
"Date 2" "Location A" "some data" 
"Date 2" "Location B" "some data" 
"Date 1" "Location A" "some data" 
"Date 1" "Location C" "some data" 

我想将它排列成列(最终将其放入电子表格中),如下所示:

        Location A    Location B    Location C
Date 3  some data     some data     some data
Date 2  some data     some data     None
Date 1  some data     None          some data

使用以下代码,当我将日期分为“月”和“日”时,我让它工作,并将日期视为整数,但一个月后,它们使用相同的日整数,所以它写在它上面。

    log = [["Location A", "somedata", 3, "Month"],["Location B", "somedata", 3, "Month"],
       ["Location C", "somedata", 3, "Month"],["Location A", "somedata", 2, "Month"],
       ["Location B", "somedata", 2, "Month"],["Location A", "somedata", 1, "Month"],
       ["Location C","somedata",1,"Month"]]

    locations = ["Location A","Location B","Location C"]

    location = locations
    days = []

    for location, time, day, month in log: 

        for i in range(len(days),day): 
            days.append([i+1] + [None for x in locations])

        days[day - 1][1 + locations.index(location)] = time
        days[day - 1][0] =  month + " " + str(day) # I just hack the date together here

    days = [i for i in days if i.count(None) < len(locations)]

    locations.insert(0,"Date")
    days.insert(0,locations)

    days = list(zip(*days))  

这会给我(正确)

['Date', 'Location A', 'Location B', 'Location C']
['Month 1', 'somedata', None, 'somedata']
['Month 2', 'somedata', 'somedata', None]
['Month 3', 'somedata', 'somedata', 'somedata']

但我想将日期保持为一个字符串,并在每次字符串更改时移动到下一列,而不是将日期用作整数。

locations = ["A","B","C"]

log = [ ["Date 2", "A", "Time"],["Date 2", "B", "Time"],["Date 2", "C", "Time"],
        ["Date 1", "A", "Time"],["Date 1", "B", "Time"],["Date 1", "C", "Time"] ]
out = []
j   = 0

for index, day in enumerate(log):

     date, location, time = day

     out.append([date] + [None for x in locations])

     if(log[index][0] != log[index-1][0] and index != 0):
          j += 1

     out[j][1 + locations.index(location)] = location

使用这样的东西,我可以得到:

['Date 2', 'A', None, 'C']
['Date 2', 'A', 'B', 'C']
['Date 1', None, None, None]
['Date 1', None, None, None]
['Date 1', None, None, None]

但是它用None填充了太多列,所以数据与日期不对应。

有人有什么想法吗?我是初学者,我正在使用 Python 3.3

非常感谢您。

【问题讨论】:

  • +1 提出了一个精心设计的问题,向我们展示了您迄今为止所做的真诚尝试

标签: python list python-3.x matrix multidimensional-array


【解决方案1】:

[社区 wiki,因为它确实是对不同方法的建议。]

该操作通常称为“旋转”。 pandas 之类的库使这变得非常简单,如果您正在编写代码来为以后的电子表格处理做中间工作,它会非常方便。

类似

import pandas as pd
df = pd.read_csv("source.dat", delim_whitespace=True, header=None)
pivoted = df.pivot(index=0, columns=1, values=2)
pivoted = pivoted.fillna("None")
pivoted.index.name = ""
pivoted.to_csv("final.csv")

生产

>>> !cat final.csv
,Location A,Location B,Location C
Date 1,some data,None,some data
Date 2,some data,some data,None
Date 3,some data,some data,some data

[我应该提一下,许多电子表格程序,包括世界上最常见的电子表格程序,也可以在本地执行此操作。]


一步一步:

首先,将文件读入DataFrame(类似电子表格页面):

>>> df = pd.read_csv("source.dat", delim_whitespace=True, header=None)
>>> df
        0           1          2
0  Date 3  Location A  some data
1  Date 3  Location B  some data
2  Date 3  Location C  some data
3  Date 2  Location A  some data
4  Date 2  Location B  some data
5  Date 1  Location A  some data
6  Date 1  Location C  some data

[7 rows x 3 columns]

然后使用pivot方法对其进行重塑:

>>> pivoted = df.pivot(index=0, columns=1, values=2)
>>> pivoted
1      Location A Location B Location C
0                                      
Date 1  some data        NaN  some data
Date 2  some data  some data        NaN
Date 3  some data  some data  some data

[3 rows x 3 columns]

pandas 使用 NaN 表示缺失值,但如果您愿意,我们可以使用 "None"

>>> pivoted = pivoted.fillna("None")
>>> pivoted
1      Location A Location B Location C
0                                      
Date 1  some data       None  some data
Date 2  some data  some data       None
Date 3  some data  some data  some data

[3 rows x 3 columns]

您似乎不需要命名索引,所以让我们摆脱它:

>>> pivoted.index.name = ""
>>> pivoted
1      Location A Location B Location C

Date 1  some data       None  some data
Date 2  some data  some data       None
Date 3  some data  some data  some data

[3 rows x 3 columns]

然后我们可以使用to_csv 将其写出来。 (如果需要,我们也可以将其直接写入Excel-format 工作簿。)

【讨论】:

  • 哇,谢谢!我已经在使用 pandas 将列放入 excel 电子表格中,但我没有意识到我可以使用它来自行格式化数据。会为我节省很多时间(和练习)。
  • 伙计,它已经在 Office 中输出了。我有一个完整的其他函数将其格式化为列并将它们一一放入,而您已经用 5 行完成了...该死的 Python。
猜你喜欢
  • 1970-01-01
  • 2023-02-19
  • 2015-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-30
  • 1970-01-01
  • 2012-04-10
相关资源
最近更新 更多