另一个熊猫问题。
阅读韦斯·麦金尼(Wes Mckinney)关于数据分析和熊猫的出色著作,我遇到了以下我认为应该起作用的事情:
假设我有一些有关提示的信息。
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的transform来做类似的事情:
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的两个切片(吸烟者和非吸烟者)进行排序,而不必更改其各自的维度。谁能解释为什么失败?
transform
没有足够的文档,但是似乎它的工作方式是传递转换函数不是将整个组作为数据框,而是单个组中的单个列。我不认为这确实意味着要执行的操作,并且您的解决方案apply
也不错。
这样吧tips.groupby('smoker').transform(func)
。将有两个组,分别称为group1和group2。转换不会调用func(group1)
和func(group2)
。相反,它先调用func(group1['total_bill'])
,然后依次func(group1['tip'])
是等,然后依次func(group2['total_bill'])
是func(group2['tip'])
。这是一个例子:
>>> print d
A B C
0 -2 5 4
1 1 -1 2
2 0 2 1
3 -3 1 2
4 5 0 2
>>> def foo(df):
... print ">>>"
... print df
... print "<<<"
... return df
>>> print d.groupby('C').transform(foo)
>>>
2 0
Name: A
<<<
>>>
2 2
Name: B
<<<
>>>
1 1
3 -3
4 5
Name: A
<<<
>>>
1 -1
3 1
4 0
Name: B
# etc.
您可以看到foo
首先被调用的是原始数据帧的C = 1组的A列,然后是该组的B列,然后是C = 2组的A列,等等。
如果您考虑转换的目的,这是有道理的。这是为了在组上应用转换功能。但是通常,将这些功能应用于整个组时,仅应用于给定的列,就没有意义。例如,pandas文档中的示例是有关使用进行z标准化的transform
。如果您有一个带有年龄和体重列的DataFrame,那么就这两个变量的总体平均值进行z标准化是没有意义的。拿一堆数字的整体平均值甚至都没有任何意义,其中一些是年龄,一些是权重。您必须相对于平均年龄对年龄进行标准化,相对于平均体重,对体重进行标准化,这意味着您要为每列分别进行转换。
因此,基本上,您无需在此处使用转换。
apply
是适当的功能,因为apply
实际上每个组都作为一个DataFrame进行transform
操作,而对每个组的每一列进行操作。
问题内容: 我正在尝试对数据框进行列绑定并遇到pandas的问题,因为它似乎不起作用: 结果是 即使我使用重置索引 然后尝试 它仍然产生相同的结果! 问题答案: 如果我正确理解您的意思,这就是您想要做的。 这使: 实际上,我期望得到相同的结果。 这是 jreback 的出色解释: “忽略”,表示未在连接轴上对齐。它只是按照传递的顺序将它们粘贴在一起,然后为实际索引(例如)重新分配一个范围,因此联接
问题内容: 我正在尝试从熊猫数据框中删除NA值。 我用过(它应该从数据帧中删除所有NA行)。但是,它不起作用。 这是代码: 这就是获取数据帧的方式。如下所示,默认方法确实将NA数据点转换为。 方便地,DF的已经包含一个NaN值(在列中),因此打印此代码,您将得到: 但是,运行不会以任何方式更改数据框。 问题答案: 默认情况下,返回没有值的新数据集。因此,您必须将其分配给变量 如果要修改它,就必须明
我想得到这样的东西 我用groupby关键字搜索了stackoverflow,没有找到与我类似的问题。
问题内容: 我是Python和Pandas库的初学者,我对DataFrame的一些基本功能感到困惑。我有一个熊猫DataFrame,如下所示: 但是,在执行一些功能之后: 我再也无法使用df.head()函数了: 我不明白为什么会这样。我在这里做错什么了吗?任何指针都欢迎!谢谢。 问题答案: 返回df的前n行。现在默认情况下要显示一个熊猫检查终端的宽度,如果该宽度太小而无法显示摘要视图。在第二种情
获取熊猫
问题内容: 我正在开发一个与tomcat 7(7.0.27)兼容的应用程序(为tomcat 5.5开发)。我在使用jstl时遇到问题,当我指定时,只是不输出标签: 在我的WEB-INF / web.xml文件中(以前使用的是2.4版本)。 .jsp文件示例: … 而不是预期的输出,我收到: 作为文本字段中的值。 我使用JSTL 1.2.1,Tomcat 7.0.27,JSP 2.2。代码会编译,当