我们说我有一个简单的数据框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
知道发生了什么或如何解决这个问题?
答案 0 :(得分:2)
transform
的结果与原始数据框中的列具有相同的数据类型。他们使用NumPy数组来保存它们的值。使列a
和b
浮动并运行:
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