我有这个大型数据框,我报告了前八行:
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']
,但是我收到了一个错误。有什么想法吗?
答案 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)
您可以在获取所需的update
后TrueType
系列。请注意,我设置了索引Genes
和Sub-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'])