熊猫';s应用:第一行重复两次 熊猫1.0.5 Python 3.8.0 Numpy 1.19.0
此代码的行为很奇怪:熊猫';s应用:第一行重复两次 熊猫1.0.5 Python 3.8.0 Numpy 1.19.0,python,pandas,numpy,Python,Pandas,Numpy,此代码的行为很奇怪: import pandas as pd def calc(row): print(f"Row: {row.to_list()}") result = pd.Series({ "sum1": row.col1 + row.col2, "sum2": row.col2 + row.col3, "sum3": row.col1 + ro
import pandas as pd
def calc(row):
print(f"Row: {row.to_list()}")
result = pd.Series({
"sum1": row.col1 + row.col2,
"sum2": row.col2 + row.col3,
"sum3": row.col1 + row.col3,
})
return result
df = pd.DataFrame({"col1":[1,2,3],
"col2":[4,5,6],
"col3":[7,8,9]})
df[["sum12", "sum23", "sum13"]] = df.apply(lambda row: calc(row), axis=1)
print(df)
它回来了
Row: [1, 4, 7]
Row: [1, 4, 7]
Row: [2, 5, 8]
Row: [3, 6, 9]
col1 col2 col3 sum12 sum23 sum13
0 1 4 7 5 11 8
1 2 5 8 7 13 10
2 3 6 9 9 15 12
第一个问题:
为什么第一排要详细阐述两次
第二个问题可能与第一个问题相关:
在我的真实代码中,第一行的细化需要0.15秒(由time.process\u time()
读取),下面的行在0.53到0.60之间。第一行细化两次,第一次0.15秒,第二次0.55秒
原因可能是什么,因为数据是统一的,所以在
calc()
中只使用numpy
,并且不涉及任何条件或数据过滤器?这是GroupBy.apply
(pandas<0.25)和df.apply
(pandas<1.1)的已知问题。第一组被评估两次的原因是apply
想知道它是否可以“优化”计算(如果apply
接收到numpy或cythonized函数,有时这是可能的)
对于pandas 0.25,此行为已在GroupBy.apply中修复。看见现在有了熊猫1.1
当1.1退出时,您将能够升级,然后您将只看到第一个组被评估一次:
pd.__version__
# '1.1.0.dev0+2004.g8d10bfb6f'
df[["sum12", "sum23", "sum13"]] = df.apply(lambda row: calc(row), axis=1)
print(df)
Row: [1, 4, 7]
Row: [2, 5, 8]
Row: [3, 6, 9]
col1 col2 col3 sum12 sum23 sum13
0 1 4 7 5 11 8
1 2 5 8 7 13 10
2 3 6 9 9 15 12
第一个(也是最明显的)问题,你的熊猫版本是什么。新增版本。我正在和最近的人一起工作。该错误似乎尚未完全解决,或者与组
无关。谢谢你指出这一点。哎呀,我自己来核实一下:那个链接是给groupby.apply的。谢谢。听起来很合理。但为什么接下来的处决需要更长的时间呢?我使用了一次执行来详细说明计算,然后发现实际循环需要5倍的时间:-(@AlexPoca我不是pandas开发人员,所以你的猜测和我的一样好。这可能与pandas测试代码中可能的快速路径有关。如果第二次时间比第一次短,它也可能与缓存有关。等等。