假设我有一个二维表,如何在Python列表两行合并
a= [['a','b','c',1],
['a','b','d',2],
['a','e','d',3],
['a','e','c',4]]
我想获得一个列表,例如,如果行中的前两个元素是相同的,总结的第四个元素,删除第三个要素和这些行组合在一起,像下面,
b = [['a','b',3],
['a','e',7]]
什么是最有效的方式做到这一点?
假设我有一个二维表,如何在Python列表两行合并
a= [['a','b','c',1],
['a','b','d',2],
['a','e','d',3],
['a','e','c',4]]
我想获得一个列表,例如,如果行中的前两个元素是相同的,总结的第四个元素,删除第三个要素和这些行组合在一起,像下面,
b = [['a','b',3],
['a','e',7]]
什么是最有效的方式做到这一点?
使用pandas
的groupby
:
import pandas as pd
df = pd.DataFrame(a)
df.groupby([0, 1]).sum().reset_index().values.tolist()
输出:
df.groupby([0, 1]).sum().reset_index().values.tolist()
Out[19]: [['a', 'b', 3L], ['a', 'e', 7L]]
如果您的清单已经排序,那么您可以使用itertools.groupby
。一旦按前两个元素进行分组,您就可以使用生成器表达式对第4个元素进行求和并创建新列表。
>>> from itertools import groupby
>>> a= [['a','b','c',1],
['a','b','d',2],
['a','e','d',3],
['a','e','c',4]]
>>> [g[0] + [sum(i[3] for i in g[1])] for g in groupby(a, key = lambda i : i[:2])]
[['a', 'b', 3],
['a', 'e', 7]]
可以使用熊猫GROUPBY方法来实现这一目标。
import pandas as pd
a= [['a','b','c',1],
['a','b','d',2],
['a','e','d',3],
['a','e','c',4]]
df = pd.DataFrame(a)
df_sum = df.groupby([0,1])[3].sum().reset_index()
array_return = df_sum.values
list_return = array_return.tolist()
print(list_return)
list_reuturn是你想要的结果。
如果你有兴趣。这是一个使用原始python的实现。我只在您提供的数据集上进行了测试。
a= [['a','b','c',1],
['a','b','d',2],
['a','e','d',3],
['a','e','c',4]]
b_dict = {}
for row in a:
key = (row[0], row[1])
b_dict[key] = b_dict[key] + row[3] if key in b_dict else row[3]
b = [[key[0], key[1], value] for key, value in b_dict.iteritems()]
@downvoter,你能解释为什么你downvote? – MaThMaX