在组内赋值

2024-09-28 01:27:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个很大的数据框,其中报告了前八行:

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”的值,其中“Reference”是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'],但是我得到了一个错误。你知道吗?你知道吗


Tags: typegroupreferencegenetruetypesubgenesgrouped
3条回答

这就是我要做的

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

我想我们应该让这比现在容易些。我经常做的是排序,这样我就可以使用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]

在获取所需的TrueType之后,可以update一个序列。注意,我设置了索引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]

相关问题 更多 >

    热门问题