如果某行中有特定值,则添加二维列表的列

时间:2019-05-01 19:27:43

标签: python

让我说我有一个2D列表:

mylist = [[3,4,5,'x'],
          [6,1,4,'x'],
          [4,7,9,'y'],
          [0,4,3,'y'],
          [5,1,7,'z']]

我如何总结第二列,其中第四元​​素相同(字母)?目前,我已使用以下方法将第四个元素隔离到一个列表中,避免重复:

newlist = list(set([r[3] for r in mylist]))

哪个返回列表['z', 'y', 'x']

我希望使用[['x', a], ['y', b]..]这样的格式,或者像{'x':a,...}这样的字典中这样的格式

其中a是第二列的总和,其中mylist[3]='x'为4 + 1,而b相同,但y为7 +4。因此,此示例将输出[['x', 5], ['y', 11], ['z', 1]]

什么是最好的方法?还是numpy / pandas会更好地处理它?

5 个答案:

答案 0 :(得分:4)

这应该做到,我正在使用zip

mylist = [[3,4,5,'x'],
          [6,1,4,'x'],
          [4,7,9,'y'],
          [0,4,3,'y'],
          [5,1,7,'z']]

#Zip all elements in the list
res = list(zip(*mylist))

#Zip the second column and character array
arr = list(zip(res[1], res[3]))
#[(4, 'x'), (1, 'x'), (7, 'y'), (4, 'y'), (1, 'z')]
dct = {}

#Calculate the sum
for num, key in arr:
    dct.setdefault(key,0)
    dct[key]+=num

print(dct)
#{'x': 5, 'y': 11, 'z': 1}

#Convert dict to list
li = []
for k, v in dct.items():
    li.append([k,v])

print(li)

输出将为

[['x', 5], ['y', 11], ['z', 1]]

答案 1 :(得分:2)

您可以使用计数器(来自收藏集):

from collections import Counter
result = Counter()
for r in mylist: 
    result[r[3]] += r[1]

您也可以在一行中完成此操作:

result = Counter( r[3] for r in mylist for _ in range(r[1]) )

或不使用计数器:

result = dict()
for _,value,_,key in map(tuple,mylist):     # for r in mylist
    result[key] = result.get(key,0) + value #    result[r[3]]=result.get(r[3],0)+r[1]

result = { r[3]:sum(v[1] for v in mylist if v[3]==r[3]) for r in mylist }

请注意,for循环的运行速度快于一个内衬

答案 2 :(得分:1)

这可以通过以下方法来完成:遍历列表中的每个元素,检查x或y的第4个位置,并添加到一些总计:

mylist = [[3,4,5,'x'],
          [6,1,4,'x'],
          [4,7,9,'y'],
          [0,4,3,'y'],
          [5,1,7,'z']]

x_total = 0
y_total = 0
for i in mylist:
    if i[3] == "y":
        y_total += i[1]
    if i[3] == 'x':
        x_total += i[1]


print("x: ",x_total)
print("y: ",y_total)

答案 3 :(得分:1)

为此,我确实更喜欢熊猫:

import pandas as pd
mylist = [[3,4,5,'x'],
          [6,1,4,'x'],
          [4,7,9,'y'],
          [0,4,3,'y'],
          [5,1,7,'z']]
df = pd.DataFrame(mylist)

这给出了:

print(df)
   0  1  2  3
0  3  4  5  x
1  6  1  4  x
2  4  7  9  y
3  0  4  3  y
4  5  1  7  z

与pandas groupby合作:

print(df.groupby(3).sum())
   0   1   2
3           
x  9   5   9
y  4  11  12
z  5   1   7

print(df.groupby(3).sum()[1].to_dict())
{'x': 5, 'y': 11, 'z': 1}

就这样

答案 4 :(得分:0)

还可以使用defaultdict

from collections import defaultdict

mylist = [
  [3,4,5,'x'],
  [6,1,4,'x'],
  [4,7,9,'y'],
  [0,4,3,'y'],
  [5,1,7,'z']
]

d = defaultdict(int)

for l in mylist:
  d[l[3]] += l[1]

# d: defaultdict(<class 'int'>, {'x': 5, 'y': 11, 'z': 1})
# dict(d) to convert to regular dict