假设我有一个包含两列布尔值的pandas数据框。我想沿着列采取产品,所以:
df.product(axis=1)
这将返回产品,但数据类型始终为int64。看看熊猫来源,看起来像_make_stat_function
(产品似乎正在调用的产品)可以使用dtype
kwarg。
Pandas docos:http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.product.html
来源:
产品从此处发货:https://github.com/pydata/pandas/blob/master/pandas/core/generic.py#L5062
到这里:https://github.com/pydata/pandas/blob/master/pandas/core/generic.py#L5246
答案 0 :(得分:2)
https://github.com/pydata/pandas/commit/3d2f11594ab546874aad07ccf08b4193ad4a12db
这个_validate_kwargs
功能是新的,非常新的(8天)。它位于主存储库中,但它可能不在任何人的发行版中。
BUG:防止在统计函数中滥用kwargs 通过过滤stat中的
kwargs
参数来解决问题#12301 在...时阻止明显无效的参数通过的功能 同时保持与类似numpy
的兼容性 功能
所以它被添加,以防止人们使用明显虚假,非像kwargs
这样的非笨拙。但我不明白为什么他们不能只使用:
_validate_kwargs(name, kwargs)
阻止所有kwargs
,因为它们未在此函数中使用(或generic.py
中的任何其他函数)。
================================
您链接的_make_stat_function
有一个:
_validate_kwargs(name, kwargs, 'out', 'dtype')
语句。但我没有在返回的函数中看到kwargs
的任何进一步使用。我不熟悉pandas
代码,但看起来validate
调用以某种方式测试这些prod
的{{1}}函数。
我稍早的kwargs
版本没有此pandas
声明。它接受validate
参数,但对它没有任何作用。它也接受一个dtype
kwarg参数,具有相同的非效果。
我建议深入研究test
个问题并提取请求,以了解添加此pandas
来电的时间和原因。在这种情况下,它似乎没有做任何重要的事情。
validate
位于同一个_validate_kwargs
文件中。这里所做的只是检查generic.py
除了'out'和kwargs
之外不包含任何内容。 'name'仅用于错误消息中。因此,如果您为其他dtype
提供其他product
,则此测试kwargs
会引发错误,但如果您给它dtype
或out
,则可以。但这并不能保证它会使用它们。
答案 1 :(得分:-1)
至于您的具体问题,将布尔值的乘积转换为int
s与检查所有布尔值是否为True
相同。
只需:df.all(axis=1)
在更具体的产品案例中,documentation不包含任何dtype操作。
但是,如果您绝对关心dtype保护,您可以执行以下操作(前提是您的数据已明确定义,即浮点数/整数等),这会将生成的dtype从product转换为您的初始dtype。
>>> import pandas as pd
>>> df = pd.DataFrame({'a': [0.1, 0.2, 0.6], 'b': [2, 3, 4]})
>>> df.dtypes
a float64
b int64
dtype: object
>>> prod = df.product()
>>> prod
a 0.012
b 24.000
dtype: float64
>>> prod.astype(df.dtypes)
a 0.012
b 24
dtype: object