在pandas组中分配值

时间:2014-05-26 15:39:20

标签: python pandas group-by

我有这个大型数据框,我报告了前八行:

Genes   Sub-Gene    Type    Reference       TrueType
1       SG1         type3       0           NothingYet
1       SG1         type1       1           NothingYet
1       SG2         type7       0           NothingYet
1       SG2         type3       0           NothingYet
1       SG2         type9       0           NothingYet
1       SG2         type9       1           NothingYet
2       SG1         type3       1           NothingYet
2       SG1         type7       0           NothingYet

对于每个子基因,我想要的是设置" NothingYet"到" Type"的值其中"参考"是1。

我的期望是:

Genes   Sub-Gene    Type    Reference       TrueType
1       SG1         type3       0           type1
1       SG1         type1       1           type1
1       SG2         type7       0           type9
1       SG2         type3       0           type9
1       SG2         type9       0           type9
1       SG2         type9       1           type9
2       SG1         type3       1           type3
2       SG1         type7       0           type3

到目前为止,这就是我所拥有的。

grouped = data.groupby(['Genes', 'Sub-Gene'])
for name, group in grouped:
    group['TrueType'] = group.ix[group.Reference.idxmax(),'Type']

当然,这不起作用,因为您无法仅使用group['TrueType']更改值。我试过了group.ix['TrueType'],但是我收到了一个错误。有什么想法吗?

4 个答案:

答案 0 :(得分:2)

恕我直言,我们应该让它比现在更容易。我经常做的是排序,以便我可以使用transform + iloc来选择适当的值,例如

grouped = df.sort("Reference").groupby(["Genes", "Sub-Gene"])
df["TrueType"] = grouped["Type"].transform(lambda x: x.iloc[-1])

例如:

In [211]: df
Out[211]: 
   Genes Sub-Gene   Type  Reference    TrueType
0      1      SG1  type3          0  NothingYet
1      1      SG1  type1          1  NothingYet
2      1      SG2  type7          0  NothingYet
3      1      SG2  type3          0  NothingYet
4      1      SG2  type9          0  NothingYet
5      1      SG2  type9          1  NothingYet
6      2      SG1  type3          1  NothingYet
7      2      SG1  type7          0  NothingYet

[8 rows x 5 columns]

In [212]: df.sort("Reference").groupby(["Genes", "Sub-Gene"])["Type"].transform(lambda x: x.iloc[-1])
Out[212]: 
0    type1
2    type9
3    type9
4    type9
7    type3
1    type1
5    type9
6    type3
Name: Type, dtype: object
制造

In [213]: df["TrueType"] = df.sort("Reference").groupby(["Genes", "Sub-Gene"])["Type"].transform(lambda x: x.iloc[-1])

In [214]: df
Out[214]: 
   Genes Sub-Gene   Type  Reference TrueType
0      1      SG1  type3          0    type1
1      1      SG1  type1          1    type1
2      1      SG2  type7          0    type9
3      1      SG2  type3          0    type9
4      1      SG2  type9          0    type9
5      1      SG2  type9          1    type9
6      2      SG1  type3          1    type3
7      2      SG1  type7          0    type3

[8 rows x 5 columns]

答案 1 :(得分:1)

这是我要做的事情

import pandas as pd
from StringIO import StringIO
strDf = """Genes,Sub-Gene,Type,Reference
1,SG1,type3,0
1,SG1,type1,1
1,SG2,type7,0
1,SG2,type3,0
1,SG2,type9,0
1,SG2,type9,1
2,SG1,type3,1
2,SG1,type7,0"""
data = pd.read_csv(StringIO(strDf))

pp = data.groupby(['Genes','Sub-Gene']).apply(lambda x:(x[x['Reference']==1])['Type'])
for k,v in pp.iterkv():
    data.loc[(data['Genes']==k[0]) & (data['Sub-Gene']==k[1]),'TrueType']=v

导致

   Genes Sub-Gene   Type  Reference TrueType
0      1      SG1  type3          0    type1
1      1      SG1  type1          1    type1
2      1      SG2  type7          0    type9
3      1      SG2  type3          0    type9
4      1      SG2  type9          0    type9
5      1      SG2  type9          1    type9
6      2      SG1  type3          1    type3
7      2      SG1  type7          0    type3

答案 2 :(得分:1)

您可以在获取所需的updateTrueType系列。请注意,我设置了索引GenesSub-Gene。如果你不想要它,你可以reset_index

In [146]: data = pd.read_csv (StringIO ('''Genes   Sub-Gene    Type    Reference       TrueType
1       SG1         type3       0           NothingYet
1       SG1         type1       1           NothingYet
1       SG2         type7       0           NothingYet
1       SG2         type3       0           NothingYet
1       SG2         type9       0           NothingYet
1       SG2         type9       1           NothingYet
2       SG1         type3       1           NothingYet
2       SG1         type7       0           NothingYet'''),sep='\s+')

In [147]: data.set_index(['Genes','Sub-Gene'],inplace=True)

In [148]: data.TrueType.update (data.ix[data.Reference == 1,'Type'])

In [149]: data
Out[149]: 
                 Type  Reference TrueType
Genes Sub-Gene                           
1     SG1       type3          0    type1
      SG1       type1          1    type1
      SG2       type7          0    type9
      SG2       type3          0    type9
      SG2       type9          0    type9
      SG2       type9          1    type9
2     SG1       type3          1    type3
      SG1       type7          0    type3

[8 rows x 3 columns]

答案 3 :(得分:0)

根据帝斯曼的回答,我会发布我会做的事情 - 只是让你看到可能的替代方案。

df.set_index(['Genes', 'Sub-Gene'], inplace=True)
df['TrueType'] = df.groupby(level=[0,1]).apply(lambda x: x.sort('Reference', ascending=False).iloc[0]['Type'])