首页 > 解决方案 > 如何在 Python 中将某些列值组合在一起并使另一列中的值成为组合值的手段?

问题描述

我有一个 Panda 数据框,其中一列是数字序列(“序列”),其中许多是重复的,而其他列值(“二进制变量”)是 1 或 0。

我已按序列列中相同的值进行分组,并使二进制变量中的列值成为该组中非零条目的百分比。

我现在想将“序列”列中的条目与相同的值组合在一起,并使“二进制变量”中的列值成为被组合的那些列的列值的平均值。

所以我的数据框看起来像这样:

df = pd.DataFrame([{'sequence' : [1, 1, 4,4,4 ,6], '二进制变量' : [1,0,0,1,0,1]})。

然后,我使用此代码将相同的值按顺序组合在一起。使用此代码: df.groupby(["sequence"]).apply(lambda 'binary variable': (binary variable!= 0).sum() / binary variable.count()*100 )

我留下了具有非重复值的序列列,而二进制变量列现在是非零的百分比。

但现在我想将一些列值组合在一起(因此对于这个玩具示例,1 和 4 值),并让二进制变量列的值是 1 和 4 值的百分比平均值。

这不是很好的措辞,因为觉得描述它很尴尬,但任何帮助将不胜感激,我已经尝试在网上查看并且使用我自己的代码进行了许多失败的尝试,但它只是不起作用。

任何帮助将不胜感激

标签: pandasdataframepandas-groupby

解决方案


似乎您想对表格进行两次分组并每次取平均值。对于第二个分组,您需要创建一个新列来指示该组。

试试这个代码:

import pandas as pd

# sequence groups for final average
grps = {(1,4):[1,4],
        (5,6):[5,6]}

# initial data
df = pd.DataFrame({'sequence' : [1,1,4,4,4,5,5,6], 'binvar' : [1,0,0,1,0,1,0,1]})

gb = df.groupby(["sequence"])['binvar'].mean().reset_index()  #.apply(lambda 'binary variable': (binary variable!= 0).sum() / binary variable.count()*100 )

def getgrp(x):  # search groups
   for k in grps:
      if x in grps[k]:
         return k

print(df.to_string(index=False))
gb['group'] = gb.apply(lambda r: getgrp(r[0]), axis = 1)

gb = gb.reset_index()
print(gb.to_string(index=False))

gb = gb[['group','binvar']].groupby("group")['binvar'].mean().reset_index()

print(gb.to_string(index=False))

输出

 sequence  binvar
        1       1
        1       0
        4       0
        4       1
        4       0
        5       1
        5       0
        6       1

 index  sequence    binvar   group
     0         1  0.500000  (1, 4)
     1         4  0.333333  (1, 4)
     2         5  0.500000  (5, 6)
     3         6  1.000000  (5, 6)

  group    binvar
 (1, 4)  0.416667
 (5, 6)  0.750000

推荐阅读