我有两个以下列表:
indexList = [5,3,2,2,7,1]
valueList = [1,2,3,4,5,6]
我想将两者排序,所以输出为:
indexList = [1,2,2,3,5,7]
valueList = [6,3,4,2,1,5]
然后,我想将缺失的索引及其对应的值填写为“ 0”:
indexList = [1,2,2,3,4,5,6,7]
valueList = [6,3,4,2,0,1,0,5]
最后,我要删除重复的索引并求和它们的值:
indexList = [1,2,3,4,5,6,7]
valueList = [6,7,2,0,1,0,5]
是否会有内置模块来执行此类任务?有人可以用我的智慧引导我吗?
答案 0 :(得分:3)
您可以使用熊猫:
import pandas as pd
indexList = [5,3,2,2,7,1]
valueList = [1,2,3,4,5,6]
s = pd.Series(valueList, index= indexList)
s = s.groupby(s.index).sum().reindex(np.arange(s.index.min(), s.index.max()+1), fill_value=0)
print(s.index.tolist())
print(s.tolist())
输出:
[1, 2, 3, 4, 5, 6, 7]
[6, 7, 2, 0, 1, 0, 5]
groupby
和sum
来组合类似的索引来求和该值。reindex
从系列索引的min
到
系列索引的max
,并使用fill_value
参数进行填充
缺少0个值的索引。tolist
。tolist
。答案 1 :(得分:2)
对于第一个问题,您可以对两个列表的zip进行排序,即对元组列表进行排序:
indexList = [5,3,2,2,7,1]
valueList = [1,2,3,4,5,6]
sorted(zip(indexList, valueList))
# [(1, 6), (2, 3), (2, 4), (3, 2), (5, 1), (7, 5)]
引用this answer:
Python按字典顺序对元组和列表进行排序;比较 第一个元素,只有在没有区别的情况下,才比较第二个元素 元素等。
如果要将值再次打包到两个列表中,则:
indexList, valueList = list(zip(*sorted(zip(indexList, valueList))))
print( indexList, valueList )
# (1, 2, 2, 3, 5, 7) (6, 3, 4, 2, 1, 5)
答案 2 :(得分:0)
(首先,我建议切换变量名称,因为它似乎valueList = [5,3,2,2,7,1]和indexList = [1,2,3,4,5,6]。)但是,而不是使用两个列表,可以从字典开始,其中的键是索引列表中的索引,值是值列表中的值。类似于:d = {5:1,3:2,2:3,2:4,7:5,1:6}按照[{https://www.saltycrane.com/blog/2007/09/how-to-sort-python-dictionary-by-keys/][1]]对字典键进行排序,以便对值列表进行排序并索引列表将与之排序。从这里也许将键(值列表)分成一个列表,将值(索引列表)分成另一个列表。您可以遍历值列表以查找丢失的值,将它们插入(并在索引列表的相应索引中插入0),然后从值列表中删除重复项,并从索引列表中删除相应的索引。希望这会有所帮助。