我有大量的数据。我想对具有一两个条件的列求和。数据已作为类存储在字典中。
数据相当广泛,但是重要的部分看起来像这样;
[["Gothenburg", "2018-01-05", "jan", 1.5, 2.3, 107],
["Gothenburg", "2018-01-15", "jan", 1.3, 3.3, 96],
["Gothenburg", "2018-01-25", "jan", 1.7, 3.2, 45],
["Gothenburg", "2018-03-05", "mar", 1.5, 2.1, 96],
["Gothenburg", "2018-03-05", "mar", 1.9, 2.8, 102],
["Malmo", "2018-01-02", "jan", 1.6, 2.3, 104],
["Malmo", "2018-01-10", "jan", 1.0, 2.9, 112],
["Malmo", "2018-03-05", "mar", 0.7, 4.3, 151],
["Malmo", "2018-03-25", "mar", 1.0, 3.3, 98],
["Hallsberg", "2018-01-25", "jan", 2.5, 2.3, 87],
["Hallsberg", "2018-02-14", "feb", 2.2, 2.3, 168],
["Hallsberg", "2018-03-06", "mar", 3.7, 2.3, 142],
["Hallsberg", "2018-04-29", "apr", 2.7, 2.3, 100]]
列的说明: 0 =城市,1 =日期,2 =月,3 =平均值1,4 =平均值2,5 =平均值3
该数组总共约8000行,可能有300个不同的城市。
我想要实现的是在第0、1、2列中的值之后对第3、4、5列求和。
例如,键为“ Malmo”的第3列的总和= 1.6 + 1.0 + 0.7 + 1.0 = 4.3 第3列的键“ Malmo”和“ jan”的总和= 1.6 + 1.0 = 2.6
这些条件和可以存储在词典中(或更好的解决方案),也可以显示在屏幕上。
我想有一个聪明的方法可以很容易地做到这一点,但是我还没有弄清楚。我曾尝试使用for循环和if情况,但这很混乱。希望在这里得到一些好的建议!
答案 0 :(得分:1)
我喜欢将pandas库用于数据框类型的对象。解决问题的方法:
import pandas as pd
df = pd.DataFrame([["Gothenburg", "2018-01-05", "jan", 1.5, 2.3, 107],
["Gothenburg", "2018-01-15", "jan", 1.3, 3.3, 96],
["Gothenburg", "2018-01-25", "jan", 1.7, 3.2, 45],
["Gothenburg", "2018-03-05", "mar", 1.5, 2.1, 96],
["Gothenburg", "2018-03-05", "mar", 1.9, 2.8, 102],
["Malmo", "2018-01-02", "jan", 1.6, 2.3, 104],
["Malmo", "2018-01-10", "jan", 1.0, 2.9, 112],
["Malmo", "2018-03-05", "mar", 0.7, 4.3, 151],
["Malmo", "2018-03-25", "mar", 1.0, 3.3, 98],
["Hallsberg", "2018-01-25", "jan", 2.5, 2.3, 87],
["Hallsberg", "2018-02-14", "feb", 2.2, 2.3, 168],
["Hallsberg", "2018-03-06", "mar", 3.7, 2.3, 142],
["Hallsberg", "2018-04-29", "apr", 2.7, 2.3, 100]])
df.columns = ['City', 'Date', 'Month', 'Mean1', 'Mean2', 'Mean3']
选择分组依据:
group_by = ['City', 'Month'] #group_by = ['Month']
使用列的总和创建group_by数据框:
City_Mon_Sum = df.groupby(group_by).agg({'Mean1': 'sum', 'Mean2': 'sum', 'Mean3': 'sum'}).reset_index()
City_Mon_Sum.rename(columns = {'Mean1': 'Group_Mean1', 'Mean2': 'Group_Mean2', 'Mean3': 'Group_Mean3'}, inplace = True )
合并两个数据框:
df = pd.merge(df, City_Mon_Sum, on = group_by)
输出:
City Date Month Mean1 Mean2 Mean3 Group_Mean1 Group_Mean2 Group_Mean3
0 Gothenburg 2018-01-05 jan 1.5 2.3 107 4.5 8.8 248
1 Gothenburg 2018-01-15 jan 1.3 3.3 96 4.5 8.8 248
2 Gothenburg 2018-01-25 jan 1.7 3.2 45 4.5 8.8 248
3 Gothenburg 2018-03-05 mar 1.5 2.1 96 3.4 4.9 198
4 Gothenburg 2018-03-05 mar 1.9 2.8 102 3.4 4.9 198
5 Malmo 2018-01-02 jan 1.6 2.3 104 2.6 5.2 216
6 Malmo 2018-01-10 jan 1.0 2.9 112 2.6 5.2 216
7 Malmo 2018-03-05 mar 0.7 4.3 151 1.7 7.6 249
8 Malmo 2018-03-25 mar 1.0 3.3 98 1.7 7.6 249
9 Hallsberg 2018-01-25 jan 2.5 2.3 87 2.5 2.3 87
10 Hallsberg 2018-02-14 feb 2.2 2.3 168 2.2 2.3 168
11 Hallsberg 2018-03-06 mar 3.7 2.3 142 3.7 2.3 142
12 Hallsberg 2018-04-29 apr 2.7 2.3 100 2.7 2.3 100
答案 1 :(得分:0)
诀窍是使用元组作为字典的键。假设您的数据存储在名为big_array_with_data
的变量中,这是使用collections.defaultdict
的解决方案:
from collections import defaultdict
monthly = [defaultdict(int) for i in range(3)]
totals = [defaultdict(int) for i in range(3)]
for place, _, month, *means in big_array_with_data:
for i, mean in enumerate(means):
monthly[i][(place, month)] += mean
totals[i][place] += mean
print(monthly[0][('Malmo', 'jan')])
print(totals[0]['Malmo'])
您也可以在没有defaultdict
的情况下这样做:
monthly[i][(place, month)] = monthly[i].get((place, month), 0) + mean
话虽如此,如果您打算定期进行这样的数据处理,那么花大量时间来研究熊猫教程就可以了。