Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在多个列上同时使用apply函数_Python_Pandas_Apply_Duration_Timedelta - Fatal编程技术网

Python 如何在多个列上同时使用apply函数

Python 如何在多个列上同时使用apply函数,python,pandas,apply,duration,timedelta,Python,Pandas,Apply,Duration,Timedelta,是否可以在pandas中的多个列上调用apply函数,如果可以,如何执行此操作。。比如说, df['Duration'] = df['Hours', 'Mins', 'Secs'].apply(lambda x,y,z: timedelta(hours=x, minutes=y, seconds=z)) 谢谢。使用在数据帧上应用轴=1 三角形=[{'base':20,'height':9},{'base':10,'height':7},{'base':40,'height':4}] tr

是否可以在pandas中的多个列上调用apply函数,如果可以,如何执行此操作。。比如说,

 df['Duration'] = df['Hours', 'Mins', 'Secs'].apply(lambda x,y,z: timedelta(hours=x, minutes=y, seconds=z))


谢谢。

使用
在数据帧上应用
轴=1

三角形=[{'base':20,'height':9},{'base':10,'height':7},{'base':40,'height':4}]

triangles\u df=pd.DataFrame(三角形)

def计算_面积(行):
返回行['base']*行['height']*0.5

三角形应用(计算面积,轴=1)

祝你好运

这可能会有帮助

import pandas as pd
import datetime as DT
df = pd.DataFrame({"Hours": [1], "Mins": [2], "Secs": [10]})
df = df.astype(int)

df['Duration'] = df[['Hours', 'Mins', 'Secs']].apply(lambda x: DT.timedelta(hours=x[0], minutes=x[1], seconds=x[2]), axis=1)

print(df)
print(df["Duration"])
输出:

   Hours  Mins  Secs  Duration
0      1     2    10  01:02:10

0   01:02:10
dtype: timedelta64[ns]

您应该使用:

df['Duration'] = pd.to_timedelta(df.Hours*3600 + df.Mins*60 + df.Secs, unit='s')
当您对
数据帧
axis=1
使用apply时,这是一个行计算,因此通常这种语法是有意义的:

df['Duration'] = df.apply(lambda row: pd.Timedelta(hours=row.Hours, minutes=row.Mins, 
    seconds=row.Secs), axis=1)
一些时间安排

import pandas as pd
import numpy as np
df = pd.DataFrame({'Hours': np.tile([1,2,3,4],50),
                  'Mins':  np.tile([10,20,30,40],50),
                  'Secs': np.tile([11,21,31,41],50)})

%timeit pd.to_timedelta(df.Hours*3600 + df.Mins*60 + df.Secs, unit='s')
#432 µs ± 5.4 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%timeit df.apply(lambda row: pd.Timedelta(hours=row.Hours, minutes=row.Mins, seconds=row.Secs), axis=1)
#12 ms ± 67.4 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

像往常一样,应用应该是最后的手段。

这当然很有帮助,但我遇到了以下错误:(“索引超出范围”,“发生在索引0”)嗨,我尝试了您的解决方案,但一直遇到此错误:()出现意外的关键字参数“axis”@空白您需要确保实际使用的是
数据帧上的
apply
,而不是
系列上的
Series.apply()
没有轴参数,这很可能是导致该错误的原因,但请不要在此处使用apply方法。对于较大的数据帧来说速度非常慢。好的,那么第一行代码是您的主要建议吗?还有,你为什么要乘以3600?cus当我使用第一行时,我得到以下错误:int太大,无法转换在我看来,您有一个
DataFrame
,有3列
Hours
Mins
Secs
,它们都是整数。我以秒为单位计算总时间,然后使用pd.to_timedelta以秒为单位。但这似乎不是你所拥有的。你应该用print(df)发布你的数据,这样我们才能真正帮助你。