另一个熊猫问题。
阅读 Wes Mckinney 关于数据分析和 Pandas 的优秀书籍,我遇到了以下我认为应该可行的事情:
假设我有一些关于提示的信息。
In [119]:
tips.head()
Out[119]:
total_bill tip sex smoker day time size tip_pct
0 16.99 1.01 Female False Sun Dinner 2 0.059447
1 10.34 1.66 Male False Sun Dinner 3 0.160542
2 21.01 3.50 Male False Sun Dinner 3 0.166587
3 23.68 3.31 Male False Sun Dinner 2 0.139780
4 24.59 3.61 Female False Sun Dinner 4 0.146808
我想知道与总账单有关的五个最大的提示,即tip_pct
分别针对吸烟者和非吸烟者。所以这有效:
def top(df, n=5, column='tip_pct'):
return df.sort_index(by=column)[-n:]
In [101]:
tips.groupby('smoker').apply(top)
Out[101]:
total_bill tip sex smoker day time size tip_pct
smoker
False 88 24.71 5.85 Male False Thur Lunch 2 0.236746
185 20.69 5.00 Male False Sun Dinner 5 0.241663
51 10.29 2.60 Female False Sun Dinner 2 0.252672
149 7.51 2.00 Male False Thur Lunch 2 0.266312
232 11.61 3.39 Male False Sat Dinner 2 0.291990
True 109 14.31 4.00 Female True Sat Dinner 2 0.279525
183 23.17 6.50 Male True Sun Dinner 4 0.280535
67 3.07 1.00 Female True Sat Dinner 1 0.325733
178 9.60 4.00 Female True Sun Dinner 2 0.416667
172 7.25 5.15 Male True Sun Dinner 2 0.710345
足够好,但后来我想使用 pandas 的变换来做同样的事情:
def top_all(df):
return df.sort_index(by='tip_pct')
tips.groupby('smoker').transform(top_all)
但相反,我得到了这个:
TypeError: Transform function invalid for data types
为什么?我知道转换需要返回一个与它作为输入接受的相同尺寸的数组,所以我认为我会遵守该要求,只需对原始 DataFrame 的两个切片(吸烟者和非吸烟者)进行排序而不改变它们各自的尺寸. 谁能解释它为什么失败?