我有一堆 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/