2015-12-06 2 views
0

Скажем, у меня есть простой dataframe, df:панды Force GroupBy преобразования, чтобы вернуть поплавки вместо Интс

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 применять, все работает отлично:

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 

Но если я (плохо):

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 

Любая идея, что происходит или как это исправить?

ответ

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 
Смежные вопросы