我目前的数据框如下所示:
Idnumber Ownership Date
1 100 2006
2 >50 2006
1 80 2007
3 NaN 2006
所有权列目前的类型为float。我想要的是在idnumber上创建一个groupby函数,返回每个Idnumber的最大值。 问题是,对于像>这样的事情是不可能的。 <或者在那里(错误:无法解决的类型:float()> = str())。
df['Ownership'] = df['Ownership'].astype(str)
df['Ownership'] = df['Ownership'].map(lambda x: x.strip('± = > + <'))
df['Ownership'] = df['Ownership'].astype(float).fillna(0.0)
df['Ownershipadjusted']= df['Ownership'].groupby([df['Idnumber'],df['Ownership']]).max()
实际上不起作用,因为将其转换回float会产生错误:无法将字符串转换为float。
df['Ownership'] = df['Ownership'].apply(pd.to_numeric, errors='coerce')
也没有所需的效果。 是否有更直接的方法从浮点数中删除符号,或者使这种转换有效?
为避免混淆,这就是我所需要的:
Idnumber Ownership Date Ownership adjusted
1 100 2006 100
2 50 2006 50
1 80 2007 100
3 0 2006 0
当然,数据框包含的观察结果远远超过4次
答案 0 :(得分:3)
将dtype
投放到str
,然后投放extract
数字并将dtype
投回float
:
In [215]:
df['Ownership'] = df['Ownership'].astype(str).str.extract('(\d+)').astype(float)
df
Out[215]:
Idnumber Ownership Date
0 1 100 2006
1 2 50 2006
2 1 80 2007
3 3 NaN 2006
您的groupby
声明也是错误的,您需要这样做:
In [218]:
df['Ownershipadjusted']= df.groupby(['Idnumber'])['Ownership'].transform('max')
df
Out[218]:
Idnumber Ownership Date Ownershipadjusted
0 1 100 2006 100
1 2 50 2006 50
2 1 80 2007 100
3 3 NaN 2006 NaN