按列分组,计算另一列中值的出现次数并除以这些数字

时间:2018-06-04 21:25:50

标签: python pandas grouping

我有一个如下所示的DataFrame:

data = pd.DataFrame({'id' : ['a1', 'a1', 'a1', 'a2','a2','a3','a3','a3'], 
                     'label' : ['0','0','1','0','1','0','1','1']})

我的目标是按 id 分组并做一些算术: 计算每组中“0”和“1”的出现次数,每个数字加1000,最后将这些数字相互划分。例如,对于组'a1':'0'出现两次,'1'出现一次,然后,2 * 1000/1 * 1000 = 2.

所需的DataFrame应如下所示:

id number
a1 2
a2 1
a3 0,5

这些SO问题给了我很多帮助:

Group by two columns and count the occurrences of each combination in pandas

pandas groupby count string occurrence over column

我已尝试过不同的版本,但仍未达到所需的输出。 任何帮助都会非常适合。

3 个答案:

答案 0 :(得分:3)

groupby然后value_counts,我们pct_change

data.groupby('id').label.apply(lambda x : x.value_counts(sort=False).pct_change()+1).dropna().reset_index(level=0)
Out[405]: 
   id  label
0  a1    2.0
0  a2    1.0
0  a3    0.5

pd.crosstab(data.id,data.label).assign(v=lambda x : x['0']/x['1'])
Out[414]: 
label  0  1    v
id              
a1     2  1  2.0
a2     1  1  1.0
a3     1  2  0.5

答案 1 :(得分:2)

data.groupby('id').label.apply(lambda x: (x == '0').sum()/(x == '1').sum())

输出:

id
a1    2.0
a2    1.0
a3    0.5
Name: label, dtype: float64

答案 2 :(得分:1)

您可以使用collections.Counter并在您的论坛中不存在1值的情况下明确定义您需要的结果。

from collections import Counter

def calculator(x):
    c = Counter(x)
    try:
        return c['0'] / c['1']
    except ZeroDivisionError:
        return np.nan

res = data.groupby('id')['label'].apply(calculator)

id
a1    2.0
a2    1.0
a3    0.5
Name: label, dtype: float64