按列表中第一项分组的列表列表中元素的平均值
Average of elements in a list of list grouped by first item in the list
我的列表看起来像 my_list = [['A', 6, 7], ['A', 4, 8], ['B', 9, 3], ['C', 1, 1]], ['B', 10, 7]]
我想找到每个内部列表中其他两列的平均值,这些列按每个内部列表中的第一列分组。
[['A', 5, 7.5], ['B', 9.5, 5], ['C', 1, 1]]
['A', 5, 7.5]
来自 ['A', (6+4)/2 ,(7+8)/2]
我不介意我最终得到一本字典什么的,但我希望它仍然是一个列表。
我试过以下方法:
my_list1 = [i[0] for i in my_list]
my_list2 = [i[1:] for i in my_list]
new_dict = {k: v for k, v in zip(my_list1, my_list2)}
拆分原始列表,因此第一列变为 KEY,第二列和第三列变为 VALUE,将其转换为字典将为您提供聚合,但问题是
我想保留小数位,它四舍五入并给我整数而不是浮点值
my_list1 = ['A', 'A', 'B', 'C', 'B']
my_list2 = [[6, 7], [4, 8], [9, 3], [1, 1], [10, 7]]
new_dict= {'A': [5, 8], 'B': [10, 5], 'C': [1, 1]}
当我理想中想要的是,[['A', 5, 7.5], ['B', 9.5, 5], ['C', 1, 1]]
(不介意它是一本字典)
可能使用 for 循环思维将第二列和第三列转换为浮点数,然后当我将其转换为字典时它会给我一个浮点数。但没有区别,它向上舍入并给出一个整数。
for i in range(0, len(my_list)):
for j in range(1, len(my_list[i])):
my_list[i][j].astype(float)
dict = {}
for l2 in my_list:
dict[l2[0]] = l2[1:]
我需要保留小数位的原因是因为第二列和第三列是指 x 和 y 坐标..
所以总而言之 objective 就是 找到每个内部列表中其他两列的平均值,这些列按每个内部列表中的第一列分组尽量保留小数位
假设您打算使用以下列表:
In [4]: my_list = [['A', 6, 7], ['A', 4, 8], ['B', 9, 3], ['C', 1, 1], ['B', 10, 7]]
只需使用 defaultdict
按第一个元素分组,然后找到 mean
:
In [6]: from collections import defaultdict
In [7]: grouper = defaultdict(list)
In [8]: for k, *tail in my_list:
...: grouper[k].append(tail)
...:
In [9]: grouper
Out[9]:
defaultdict(list,
{'A': [[6, 7], [4, 8]], 'B': [[9, 3], [10, 7]], 'C': [[1, 1]]})
In [10]: import statistics
In [11]: {k: list(map(statistics.mean, zip(*v))) for k,v in grouper.items()}
Out[11]: {'A': [5, 7.5], 'B': [9.5, 5], 'C': [1, 1]}
请注意,如果您在 Python2,则无需在 map
之后调用 list
。此外,您应该使用 iteritems
而不是 items
。
此外,您还必须执行以下操作:
for sub in my_list:
grouper[sub[0]].append(sub[1:])
而不是 Python 3.
上的更清洁版本
最后,Python中没有statistics
模块 2. 所以就这样做:
def mean(seq):
return float(sum(seq))/len(seq)
并使用 mean
而不是 statistics.mean
import operator as op
import itertools as it
import statistics as stats
iterables = [['A', 6, 7], ['A', 4, 8], ['B', 9, 3], ['C', 1, 1], ['B', 10, 7]]
groups = it.groupby(sorted(iterables), op.itemgetter(0))
{k: list(map(stats.mean, zip(*[i[1:] for i in g]))) for k, g in groups}
# {'A': [5, 7.5], 'B': [9.5, 5], 'C': [1, 1]}
我的列表看起来像 my_list = [['A', 6, 7], ['A', 4, 8], ['B', 9, 3], ['C', 1, 1]], ['B', 10, 7]]
我想找到每个内部列表中其他两列的平均值,这些列按每个内部列表中的第一列分组。
[['A', 5, 7.5], ['B', 9.5, 5], ['C', 1, 1]]
['A', 5, 7.5]
来自 ['A', (6+4)/2 ,(7+8)/2]
我不介意我最终得到一本字典什么的,但我希望它仍然是一个列表。
我试过以下方法:
my_list1 = [i[0] for i in my_list] my_list2 = [i[1:] for i in my_list] new_dict = {k: v for k, v in zip(my_list1, my_list2)}
拆分原始列表,因此第一列变为 KEY,第二列和第三列变为 VALUE,将其转换为字典将为您提供聚合,但问题是
我想保留小数位,它四舍五入并给我整数而不是浮点值
my_list1 = ['A', 'A', 'B', 'C', 'B']
my_list2 = [[6, 7], [4, 8], [9, 3], [1, 1], [10, 7]]
new_dict= {'A': [5, 8], 'B': [10, 5], 'C': [1, 1]}
当我理想中想要的是,[['A', 5, 7.5], ['B', 9.5, 5], ['C', 1, 1]]
(不介意它是一本字典)
可能使用 for 循环思维将第二列和第三列转换为浮点数,然后当我将其转换为字典时它会给我一个浮点数。但没有区别,它向上舍入并给出一个整数。
for i in range(0, len(my_list)): for j in range(1, len(my_list[i])): my_list[i][j].astype(float) dict = {} for l2 in my_list: dict[l2[0]] = l2[1:]
我需要保留小数位的原因是因为第二列和第三列是指 x 和 y 坐标..
所以总而言之 objective 就是 找到每个内部列表中其他两列的平均值,这些列按每个内部列表中的第一列分组尽量保留小数位
假设您打算使用以下列表:
In [4]: my_list = [['A', 6, 7], ['A', 4, 8], ['B', 9, 3], ['C', 1, 1], ['B', 10, 7]]
只需使用 defaultdict
按第一个元素分组,然后找到 mean
:
In [6]: from collections import defaultdict
In [7]: grouper = defaultdict(list)
In [8]: for k, *tail in my_list:
...: grouper[k].append(tail)
...:
In [9]: grouper
Out[9]:
defaultdict(list,
{'A': [[6, 7], [4, 8]], 'B': [[9, 3], [10, 7]], 'C': [[1, 1]]})
In [10]: import statistics
In [11]: {k: list(map(statistics.mean, zip(*v))) for k,v in grouper.items()}
Out[11]: {'A': [5, 7.5], 'B': [9.5, 5], 'C': [1, 1]}
请注意,如果您在 Python2,则无需在 map
之后调用 list
。此外,您应该使用 iteritems
而不是 items
。
此外,您还必须执行以下操作:
for sub in my_list:
grouper[sub[0]].append(sub[1:])
而不是 Python 3.
上的更清洁版本最后,Python中没有statistics
模块 2. 所以就这样做:
def mean(seq):
return float(sum(seq))/len(seq)
并使用 mean
而不是 statistics.mean
import operator as op
import itertools as it
import statistics as stats
iterables = [['A', 6, 7], ['A', 4, 8], ['B', 9, 3], ['C', 1, 1], ['B', 10, 7]]
groups = it.groupby(sorted(iterables), op.itemgetter(0))
{k: list(map(stats.mean, zip(*[i[1:] for i in g]))) for k, g in groups}
# {'A': [5, 7.5], 'B': [9.5, 5], 'C': [1, 1]}