我正在使用一个数据框,并且必须进行分组,以便对我的数据进行一些操作。
这是我的数据框的一个示例:
I SI deltas
1 10 0.1
1 14 0.1
2 10 0.1
2 18 0.3
1 17 0.05
2 30 0.3
1 10 0.4
1 14 0.2
2 10 0.1
2 18 0.2
1 17 0.15
现在,对于每个I,我都以这种方式计算SI的相对频率:
results = df.groupby(['I', 'SI'])[['deltas']].sum()
#for each I, we sum all the weights (Deltas)
denom = results.groupby('I')['deltas'].sum()
#for each I, we divide each deltas by the sum, getting them normalized to one
results.deltas = results.deltas / denom
所以我的数据框现在看起来像这样:
我= 1
deltas
SI = 10 0.5
SI = 14 0.3
SI = 17 0.2
I = 2
deltas
SI = 10 0.2
SI = 18 0.5
SI = 30 0.3
....
我需要做的是为每个我打印增量乘以其相对SI的增量:
I = 1 sum = 0.5 * 10 + 0.3*14 + 0.2*17 = 12.6
I = 2 sum = 0.2*10 + 18*0.5 + 30*0.3 = 21
但是从现在开始,我正在使用索引为I和SI的数据框,所以我不知道如何使用它们。我尝试了这段代码:
for idx2, j in enumerate(results.index.get_level_values(0).unique()):
#print results.loc[j]
f.write("%d\t"%(j)+results.loc[j].to_string(index=False)+'\n')
但是我不确定如何继续获取索引值
答案 0 :(得分:1)
让我们假设您在初始转换后拥有一个输入数据框df
。如果SI
是您的索引,则首先通过df = df.reset_index()
将其提升为一列。
I SI weight
0 1 10 0.5
1 1 14 0.3
2 1 17 0.2
3 2 10 0.2
4 2 18 0.5
5 2 30 0.3
然后可以计算SI
和weight
的乘积,然后使用GroupBy
+ sum
:
res = df.assign(prod=df['SI']*df['weight'])\
.groupby('I')['prod'].sum().reset_index()
print(res)
I prod
0 1 12.6
1 2 20.0
对于单独的单个数据帧,可以将np.dot
用作点积。
s = pd.Series([0.5, 0.3, 0.2], index=[10, 14, 17])
s.index.name = 'SI'
res = np.dot(s.index, s) # 12.6