【发布时间】:2019-04-10 20:13:31
【问题描述】:
一位初学者在这里寻求一些帮助,以从元组列表中获取统计信息,其中元组包含名称和数据。
我有以下格式的列表:
list = [(name1, name2, name3, name(...), value1, value2, value3, value(...))]
例子:
mylist = [('red', 1, 100, 0.075, 0.055, 1.88),
('red', 1, 100, 0.0825, 0.05, 1.84),
('red', 1, 2, 3.7, 0.08, 4.20),
('green', 2, 2, 0.37, 0.8, 0.9),
('green', 2, 2, 0.85, 0.35, 1.24)]
我需要的是名称相同的元组中值的平均值和标准差。
输出应该是:
output = [(name1, name2, name3, name(...), value1_mean, value1_stdev, value2_mean, value2_stdev, value3_mean, value3_stdev, value(...)_mean, value(...)_stdev)]
对于所有唯一的name1, name2, name3, name(...) 组合。
对于上面的列表,所需的输出如下:
output = [('green', 2, 2, 0.61, 0.33941125496954283, 0.575, 0.3181980515339464, 1.07, 0.2404163056034261),
('red', 1, 2, 3.7, 0, 0.08, 0, 4.2, 0),
('red', 1, 100, 0.07875, 0.005303300858899111, 0.052500000000000005, 0.003535533905932736, 1.8599999999999999, 0.02828427124746177)]
我设法让它工作,而不是以优雅的方式,我被限制为 3 个名称和 3 个值:
import statistics
mylist = [('red', 1, 100, 0.075, 0.055, 1.88),
('red', 1, 100, 0.0825, 0.05, 1.84),
('red', 1, 2, 3.7, 0.08, 4.20),
('green', 2, 2, 0.37, 0.8, 0.9),
('green', 2, 2, 0.85, 0.35, 1.24)]
d_0 = []
d_1 = []
d_2 = []
for i in mylist:
d_0.append(i[0])
d_1.append(i[1])
d_2.append(i[2])
s_d_0 = set(d_0)
s_d_1 = set(d_1)
s_d_2 = set(d_2)
for d0 in s_d_0:
for d1 in s_d_1:
for d2 in s_d_2:
for c in [3,4,5]:
exec('v' + str(c) + '_' + str(d0) + str(d1) + str(d2) + ' = []')
results = []
for t in mylist:
for d0 in s_d_0:
for d1 in s_d_1:
for d2 in s_d_2:
if d0 == t[0] and d1 == t[1] and d2 == t[2]:
for c in [3,4,5]:
exec('v' + str(c) + '_' + str(d0) + str(d1) + str(d2) + '.append( t[' + str(c) + '])')
for d0 in s_d_0:
for d1 in s_d_1:
for d2 in s_d_2:
asd = [d0, d1, d2]
for c in [3, 4, 5]:
length = 0
exec('length = len(v' + str(c) + '_' + str(d0) + str(d1) + str(d2) + ')')
if length == 0:
exec('mean' + str(c) + '_' + str(d0) + str(d1) + str(d2) + ' = 0')
exec('stdev' + str(c) + '_' + str(d0) + str(d1) + str(d2) + ' = 0')
if not length == 0:
exec('mean' + str(c) + '_' + str(d0) + str(d1) + str(d2) + ' = statistics.mean(v' + str(c) + '_' + str(d0) + str(d1) + str(d2) + ')')
exec('stdev' + str(c) + '_' + str(d0) + str(d1) + str(d2) + ' = 0')
if not length == 1 and not length == 0:
exec('stdev' + str(c) + '_' + str(d0) + str(d1) + str(d2) + ' = statistics.stdev(v' + str(
c) + '_' + str(d0) + str(d1) + str(d2) + ')')
exec('fgh = (mean' + str(c) + '_' + str(d0) + str(d1) + str(d2) + ', stdev' + str(c) + '_' + str(d0) + str(d1) + str(d2) + ')')
asd.append(fgh)
results.append(asd)
final = []
for z in results:
if z[3][0] is not 0:
final.append(z)
output = []
for fin in final:
final3 = []
for fiin in fin:
if not isinstance(fiin, tuple):
final3.append(fiin)
if isinstance(fiin, tuple):
fiin1, fiin2 = fiin[0], fiin[1]
final3.append(fiin1)
final3.append(fiin2)
output.append(tuple(final3))
for f in output:
print(f)
有没有办法以更强大的方式获得相同的输出,可能使用numpy 或pandas?最好我可以指定一个不同于 3 的数字来定义元组的左值中有多少个定义 names。
谢谢!
【问题讨论】:
标签: python-3.x pandas numpy statistics tuples