当前位置: 首页 > 面试题库 >

熊猫的转换不起作用按输出分组

西门品
2023-03-14
问题内容

另一个熊猫问题。

阅读韦斯·麦金尼(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。代码会编译,当