2017-08-03 102 views
1

我搜索了这一点,但还是不能让我的头轮组,所以......熊猫分配值从组的一个成员所有其他成员

的数据(dataFrame)是这个样子( *表示期望的输出):

 
    id parentid page_number is_critical_page page_number_of_critical* page_numbers_not_critical* 
    0 1 1 1 True 1 2,3,4,5 
    1 2 1 2 False 1 2,3,4,5 
    2 3 1 3 False 1 2,3,4,5 
    3 4 1 4 False 1 2,3,4,5 
    4 5 1 5 False 1 2,3,4,5 
    5 6 2 1 False 2 1,3 
    6 7 2 2 True 2 1,3 
    7 8 2 3 False 2 1,3 
    8 9 3 1 False -1 1 
    9 10 4 1 True 1 -1 

欲:

  1. 组行乘parentid

    dgroups=dataFrame.groupby('parentid') 
    
  2. 应用任意操作,以基团:

    def func(grp): 
        grp['has_critical_page'] = grp['is_critical_page'].sum()>0 # simple operation 
        ### Apply operation here to generate: 
        ### ?? grp['page_number_of_critical*'] = ... ?? # is a scalar 
        ### ?? grp['page_numbers_not_critical'] = ... ?? # is a list 
        return grp 
    
    dgroups.apply(func) 
    
    print dgroups.describe() 
    

-1的是N /正如 - 可能是一个NaNNone-99或任何其它特殊值。

我不知道是否使用applytransformfilter等,或是否申请(..)funcdataFrame或这些组的行。

试图避免当然循环....谢谢!

PS积分为如何在组内处理的is_critical_page多命中......

+0

PPS不知道如何格式化数据表... – jtlz2

+0

感谢谁固定的表... – jtlz2

回答

4

其中一个方法是通过创建字典和映射,你可以将PAGE_NUMBER转换为字符串,然后加入他们的行列,而创建一个字典,然后映射字典即

df['page_number'] = df['page_number'].astype(str) 
critical_pages=df[df.is_critical_page] 
not_critical_pages=df[~df.is_critical_page] 

not_critical_pages = not_critical_pages.groupby('parentid')['page_number'].apply(','.join).to_dict() 
critical_pages = critical_pages.groupby('parentid')['page_number'].apply(','.join).to_dict() 

df['page_number_of_critical*'] = df['parentid'].map(critical_pages) 
df['not_page_number_of_critical*'] = df['parentid'].map(not_critical_pages) 

输出:

 
    id parentid page_number is_critical_page page_number_of_critical* \ 
0 1   1   1    True      1 
1 2   1   2    False      1 
2 3   1   3    False      1 
3 4   1   4    False      1 
4 5   1   5    False      1 
5 6   2   1    False      2 
6 7   2   2    True      2 
7 8   2   3    False      2 
8 9   3   1    False      NaN 
9 10   4   1    True      1 

    not_page_number_of_critical* 
0      2,3,4,5 
1      2,3,4,5 
2      2,3,4,5 
3      2,3,4,5 
4      2,3,4,5 
5       1,3 
6       1,3 
7       1,3 
8       1 
9       NaN 

您可以使用fillna填写您想要的值。

您还可以使用应用即

df['page_number'] = df['page_number'].astype(str) 

crn_pages = df.groupby(['parentid','is_critical_page'])['page_number'].apply(','.join).to_dict() 

df['page_number_of_critical*'] = df.apply(lambda x: crn_pages[x['parentid'],True] if (x['parentid'],True) in crn_pages else -1 ,axis=1) 
df['not_page_number_of_critical*'] = df.apply(lambda x: crn_pages[x['parentid'],False] if (x['parentid'],False) in crn_pages else -1 ,axis=1) 

希望它可以帮助

+0

对我的作品 - 非常感谢! – jtlz2

+0

很高兴帮助@ jtlz2。 – Dark