簡體   English   中英

如果兩個其他鍵值對匹配,則為字典列表的Python和值

[英]Python sum values of list of dictionaries if two other key value pairs match

我有以下形式的詞典列表:

lst = [{"Name":'Nick','Hour':0,'Value':2.75},
       {"Name":'Sam','Hour':1,'Value':7.0},
       {"Name":'Nick','Hour':0,'Value':2.21},
       {'Name':'Val',"Hour":1,'Value':10.1},
       {'Name':'Nick','Hour':1,'Value':2.1},  
       {'Name':'Val',"Hour":1,'Value':11},]  

我希望能夠為特定小時的名稱加總所有值,例如,如果Name == Nick and Hour == 0 ,我希望值給出符合條件的所有值的總和。 2.75 + 2.21 ,根據上面的部分。

我已經嘗試了以下但是它並沒有幫助我解決這兩個問題。

finalList = collections.defaultdict(float)
for info in lst:
    finalList[info['Name']] += info['Value']
finalList = [{'Name': c, 'Value': finalList[c]} for c in finalList]  

這總結了特定Name所有值,而不是檢查Hour是否相同。 如何將該條件合並到我的代碼中?

我的預期產量:

finalList = [{"Name":'Nick','Hour':0,'Value':4.96},
       {"Name":'Sam','Hour':1,'Value':7.0},
       {'Name':'Val',"Hour":1,'Value':21.1},
       {'Name':'Nick','Hour':1,'Value':2.1}...]  

考慮使用pandas模塊 - 這對於這樣的數據集非常舒適:

import pandas as pd

In [109]: lst
Out[109]:
[{'Hour': 0, 'Name': 'Nick', 'Value': 2.75},
 {'Hour': 1, 'Name': 'Sam', 'Value': 7.0},
 {'Hour': 0, 'Name': 'Nick', 'Value': 2.21},
 {'Hour': 1, 'Name': 'Val', 'Value': 10.1},
 {'Hour': 1, 'Name': 'Nick', 'Value': 2.1}]

In [110]: df = pd.DataFrame(lst)

In [111]: df
Out[111]:
   Hour  Name  Value
0     0  Nick   2.75
1     1   Sam   7.00
2     0  Nick   2.21
3     1   Val  10.10
4     1  Nick   2.10

In [123]: df.groupby(['Name','Hour']).sum().reset_index()
Out[123]:
   Name  Hour  Value
0  Nick     0   4.96
1  Nick     1   2.10
2   Sam     1   7.00
3   Val     1  10.10

將其導出為CSV:

df.groupby(['Name','Hour']).sum().reset_index().to_csv('/path/to/file.csv', index=False)

結果:

Name,Hour,Value
Nick,0,4.96
Nick,1,2.1
Sam,1,7.0
Val,1,10.1

如果你想把它作為字典:

In [125]: df.groupby(['Name','Hour']).sum().reset_index().to_dict('r')
Out[125]:
[{'Hour': 0, 'Name': 'Nick', 'Value': 4.96},
 {'Hour': 1, 'Name': 'Nick', 'Value': 2.1},
 {'Hour': 1, 'Name': 'Sam', 'Value': 7.0},
 {'Hour': 1, 'Name': 'Val', 'Value': 10.1}]

你可以用熊貓做很多奇特的事:

In [112]: df.loc[(df.Name == 'Nick') & (df.Hour == 0), 'Value'].sum()
Out[112]: 4.96


In [121]: df.groupby('Name')['Value'].agg(['sum','mean'])
Out[121]:
        sum       mean
Name
Nick   7.06   2.353333
Sam    7.00   7.000000
Val   10.10  10.100000
[{'Name':name, 'Hour':hour, 'Value': sum(d['Value'] for d in lst if d['Name']==name and d['Hour']==hour)} for hour in hours for name in names]

如果你還沒有列表(或集合)中的所有名稱和小時數,你可以這樣得到它們:

names = {d['Name'] for d in lst}
hours= {d['Hour'] for d in lst}

您可以使用任何(可散列)對象作為python字典的鍵,因此只需使用包含Name和Hour作為鍵的元組:

from collections import defaultdict
d = defaultdict(float)
for item in lst:
    d[(item['Name'], item['Hour'])] += item['Value']

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM