gpt4 book ai didi

python - Pandas 数据框通过比较所有其他行创建新列

转载 作者:行者123 更新时间:2023-12-01 07:42:22 26 4
gpt4 key购买 nike

我有以下示例:

import pandas as pd
import numpy as np
import time

def function(value,df):
return len(df[(df['A']<value)])

df= pd.DataFrame(np.random.randint(0,100,size=(30000, 1)), columns=['A'])

start=time.time()
df['B']=pd.Series([len(df[df['A']<value]) for value in df['A']])
end=time.time()
print("list comprehension time:",end-start)

start=time.time()
df['B']=df['A'].apply(function,df=df)
end=time.time()
print("apply time:",end-start)

start=time.time()
series = []
for index, row in df.iterrows():
series.append(len(df[df['A']<row['A']]))
df['B'] = series
end=time.time()
print("loop time:",end-start)

输出:

time: 19.54859232902527
time: 23.598857402801514
time: 26.441001415252686

此示例通过计算所有值优于该行当前值的行来创建一个新列。

对于这种类型的问题(当我创建一个新列时,在比较数据帧的所有其他行后),我尝试了应用函数、列表理解和经典循环,但我认为它们很慢。

有没有更快的方法?

Ps:这个例子的专门解决方案并不是我最感兴趣的。我更喜欢针对此类问题的通用解决方案。

另一个示例可以是:对于具有字符串列的数据框,通过计算数据框中每行以字符串第一个字母开头的字符串数来创建一个新列。

最佳答案

通常我使用numpy广播来完成这种类型的任务

%timeit df['B']=pd.Series([len(df[df['A']<value]) for value in df['A']])
1 loop, best of 3: 25.4 s per loop
%timeit df['B']=(df.A.values<df.A.values[:,None]).sum(1)
1 loop, best of 3: 1.74 s per loop


#df= pd.DataFrame(np.random.randint(0,100,size=(30000, 1)), columns=['A'])

关于python - Pandas 数据框通过比较所有其他行创建新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56636880/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com