用于排列数据帧的聚合函数

时间:2017-05-17 14:21:17

标签: python pandas group-by aggregate

我有以下数据框,

>>> data = pd.DataFrame({'Name': ['CTA15', 'CTA15', 'AC007', 'AC007', 'AC007'], 
'ID': [22, 22, 2, 2, 2], 
'Sample':['PE12', 'PL14', 'AE29', 'AE04', 'PE03'], 
'count_col' : [2, 2, 3, 3, 3]})

>>> data
   ID   Name Sample  count_col
0  22  CTA15   PE12          2
1  22  CTA15   PL14          2
2   2  AC007   AE29          3
3   2  AC007   AE04          3
4   2  AC007   PE03          3

我需要重新排列我的数据框,如下所示,

 Name       Sample      count_col
    CTA15       PE12          2
                PL14        
    AC007       AE10          3
                AE29    
                PE03    

我尝试的是,

pd.pivot_table(All_variants_REL,index=["Name",'Sample'],
               values=['Count'],aggfunc={'Name':np.size})

但它没有显示计数列中的准确计数 任何帮助都会很棒..

2 个答案:

答案 0 :(得分:2)

mask创建的布尔掩码似乎需要astype + duplicated

注意:我将强制转换添加到str,因为在count列中获取混合值(带有整数的字符串),并且可以破坏一些pandas函数。

Notice1 - 解决方案有效,如果Name列中的值已排序。

cols = ['Name','count']
df[cols] = df[cols].astype(str).mask(df.duplicated(['Name']), '')
print (df)
    Name  ID Sample count
0  CTA15  22   PE12     2
1         22   PL14      
2  AC007   2   AE29     3
3          2   AE04      
4          2   PE03    

如果需要NaNs,只需省略, - 但最后一列值会转换为float(因为NaN是浮动的)

cols = ['Name','count']
df[cols] = df[cols].mask(df.duplicated(['Name']))
print (df)
    Name  ID Sample  count
0  CTA15  22   PE12    2.0
1    NaN  22   PL14    NaN
2  AC007   2   AE29    3.0
3    NaN   2   AE04    NaN
4    NaN   2   PE03    NaN  

可以使用lists

cols = ['Name','count', 'ID']
df = df.groupby(cols)['Sample'].apply(list).reset_index()
print (df)
    Name  count  ID              Sample
0  AC007      3   2  [AE29, AE04, PE03]
1  CTA15      2  22        [PE12, PL14]

答案 1 :(得分:1)

为什么不简单地设置多指数?如果您的列数多于示例DataFrame中的列数,则这样做会转换为显示所有列。

>>> data = pd.DataFrame({'Name': ['CTA15', 'CTA15', 'AC007', 'AC007', 'AC007'], 
'ID': [22, 22, 2, 2, 2], 
'Sample':['PE12', 'PL14', 'AE29', 'AE04', 'PE03'], 
'count_col' : [2, 2, 3, 3, 3]})

(附注:我不建议使用名称为count的列,因为它是DataFrame方法,并且会引发问题。例如,{{1} }并没有像我们预期的那样返回data.count。)

Series

设置多索引,它将作为任意大>>> data ID Name Sample count_col 0 22 CTA15 PE12 2 1 22 CTA15 PL14 2 2 2 AC007 AE29 3 3 2 AC007 AE04 3 4 2 AC007 PE03 3 的解决方案。

DataFrame