强制pandas groupby转换为返回浮点数而不是整数

时间:2015-12-06 19:52:05

标签: python pandas

我们说我有一个简单的数据框df

df = pd.DataFrame({'a': [1, 2, 3, 4, 5, 6],
                   'b': [1, 2, 3, 4, 5, 6],
                   'c': ['q', 'q', 'q', 'q', 'w', 'w'],  
                   'd': ['z', 'z', 'z', 'o', 'o', 'o']})

如果我使用groupby apply,一切正常:

df.groupby(['c', 'd']).apply(lambda x: pd.Series(np.sum(x.a + x.b) ** .5))
            0
c d          
q o  2.828427
  z  3.464102
w o  4.690416

但是如果我使用transform,则输出被舍入(坏):

df.groupby(['c', 'd']).transform(lambda x: pd.Series(np.sum(x.a + x.b) ** .5))
   a  b
0  3  3
1  3  3
2  3  3
3  2  2
4  4  4
5  4  4

试图强制从函数中浮动似乎没有帮助:

df.groupby(['c', 'd']).transform(lambda x: pd.Series((float(np.sum(x.a + x.b)) ** .5), dtype='float'))
   a  b
0  3  3
1  3  3
2  3  3
3  2  2
4  4  4
5  4  4

知道发生了什么或如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

transform的结果与原始数据框中的列具有相同的数据类型。他们使用NumPy数组来保存它们的值。使列ab浮动并运行:

df = pd.DataFrame({'a':[1,2,3,4,5,6.],
               'b':[1,2,3,4,5,6.],
               'c':['q', 'q', 'q', 'q', 'w', 'w'],  
               'd':['z','z','z','o','o','o']})   
>>> df.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 6 entries, 0 to 5
Data columns (total 4 columns):
a    6 non-null float64
b    6 non-null float64
c    6 non-null object
d    6 non-null object
dtypes: float64(2), object(2)
memory usage: 240.0+ bytes

现在:

print(df.groupby(['c', 'd']).transform(lambda x: pd.Series(np.sum(x.a + x.b)**.5)))

打印:

         a         b
0  3.464102  3.464102
1  3.464102  3.464102
2  3.464102  3.464102
3  2.828427  2.828427
4  4.690416  4.690416
5  4.690416  4.690416