python - 根据另一个列表更改列表列表的顺序

标签 python

我有一堆 CSV 文件,其中第一行是列名,现在我想根据另一个列表更改顺序。
示例:

[
['date','index','name','position'],
['2003-02-04','23445','Steiner, James','98886'],
['2003-02-04','23446','Holm, Derek','2233'],
...
]

上面的顺序在文件之间略有不同,但相同的列名总是可用的。

所以我希望将列重新排列为:

['index','date','name','position']

我可以通过比较第一行来解决这个问题,为每一列创建一个索引,然后使用 for 循环将每一行重新映射到一个新的列表列表中。
虽然它有效,但感觉太丑陋了,即使我的盲人老阿姨看到它也会对我大吼大叫。

IRC 上有人告诉我要查看 map()operator,但我经验不足,无法将它们放在一起。 :/

谢谢。

最佳答案

纯 Python

你可以使用 zip转置您的数据:

data = [
['date','index','name','position'],
['2003-02-04','23445','Steiner, James','98886'],
['2003-02-04','23446','Holm, Derek','2233']
]

columns = list(zip(*data))
print(columns)
# [('date', '2003-02-04', '2003-02-04'), ('index', '23445', '23446'), ('name', 'Steiner, James', 'Holm, Derek'), ('position', '98886', '2233')]

现在修改列顺序变得更加容易。

要计算所需的排列,您可以使用:

old = data[0]
new = ['index','date','name','position']
mapping = {i:new.index(v) for i,v in enumerate(old)}
# {0: 1, 1: 0, 2: 2, 3: 3}

您可以将排列应用于列:

columns = [columns[mapping[i]] for i in range(len(columns))]
# [('index', '23445', '23446'), ('date', '2003-02-04', '2003-02-04'), ('name', 'Steiner, James', 'Holm, Derek'), ('position', '98886', '2233')]

并将它们转回:

list(zip(*columns))
# [('index', 'date', 'name', 'position'), ('23445', '2003-02-04', 'Steiner, James', '98886'), ('23446', '2003-02-04', 'Holm, Derek', '2233')]

与 Pandas

对于此类任务,您应该使用 pandas . 它可以解析 CSV、重新排序列、对它们进行排序并保留索引。

如果您已经导入了数据,您可以使用这些方法导入列,将第一行用作标题并将index 列设置为索引。

import pandas as pd
df = pd.DataFrame(data[1:], columns=data[0]).set_index('index')

df 则变为:

            date            name position
index
23445  2003-02-04  Steiner, James    98886
23446  2003-02-04     Holm, Derek     2233

您可以通过使用 pandas.read_csv 正确导入 CSV 来避免这些步骤.您需要 usecols=['index','date','name','position'] 才能直接获得正确的顺序。

关于python - 根据另一个列表更改列表列表的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46472826/

相关文章:

python - 是否可以强制 Numpy 在进行类型转换时使用 cutout 而不是溢出?

python - 遍历字典列表

python - Pandas Groupby.diff 用零填充缺失的行

python - 我如何在这个 Python 作业中将列表、标量和向量联系在一起?

python - 查找列表是否包含特定的 numpy 数组

python - 使用 Python 3.5 从 CSV 文件的两列中删除特定字符

python - TypeError: must be string, not datetime.datetime 使用strptime时

python - 在 Python 中将字符串转换为带小数的整数

python - 分组后,在 pandas python 中找到每个组中最接近的一个

python - CountVectorizer() 不适用于单字母单词