【发布时间】:2014-10-09 04:51:58
【问题描述】:
我想知道是否有更快、更“pythonic”的方式来执行以下操作,例如使用一些内置方法。 给定一个 pandas DataFrame 或 numpy 浮点数组,如果该值等于或小于 0.5,我需要计算倒数并乘以 -1 并用新计算的值替换旧值。 “变换”可能是一个不好的词选择,如果你有更好/更准确的描述,请告诉我。
感谢您的帮助和支持!!
数据:
import numpy as np
import pandas as pd
dicti = {"A" : np.arange(0.0, 3, 0.1),
"B" : np.arange(0, 30, 1),
"C" : list("ELVISLIVES")*3}
df = pd.DataFrame(dicti)
我的功能:
def transform_colname(df, colname):
series = df[colname]
newval_list = []
for val in series:
if val <= 0.5:
newval = (1/val)*-1
newval_list.append(newval)
else:
newval_list.append(val)
df[colname] = newval_list
return df
函数调用:
transform_colname(df, colname="A")
**--> 我在这里总结一下结果,因为 cmets 不允许发布代码(或者我不知道该怎么做)。**
感谢大家快速而精彩的回答!
将 ipython "%timeit" 与“真实”数据一起使用:
我的职能: 10 个循环,3 个循环中的最佳:每个循环 24.1 毫秒
来自 jojo:
def transform_colname_v2(df, colname):
series = df[colname]
df[colname] = np.where(series <= 0.5, 1/series*-1, series)
return df
100 个循环,3 个循环中的最佳:每个循环 2.76 毫秒
来自 FooBar:
def transform_colname_v3(df, colname):
df.loc[df[colname] <= 0.5, colname] = - 1 / df[colname][df[colname] <= 0.5]
return df
100 次循环,3 次中的最佳:每个循环 3.32 毫秒
来自 dmvianna:
def transform_colname_v4(df, colname):
df[colname] = df[colname].where(df[colname] <= 0.5, (1/df[colname])*-1)
return df
100 个循环,3 个循环中的最佳:每个循环 3.7 毫秒
请告诉/告诉我您是否会以不同的方式实现您的代码!
最后一个问题:(已回答) "FooBar" 和 "dmvianna" 的版本如何成为“通用”?我的意思是,我必须将列的名称写入函数(因为将其用作变量不起作用)。请解释最后一点! --> 谢谢jojo,“.loc”不是正确的方法,但非常简单的 df[colname] 就足够了。将上述功能更改为更“通用”。 (也将“>”更改为“
非常感谢!!
【问题讨论】:
-
@jojo:谢谢!!您的解决方案更 Pythonic,但速度较慢。我的功能:10000 个循环,最好的 3 个:每个循环 164 µs。您的版本:1000 个循环,最好的 3 个:每个循环 395 µs。
-
您的速度测试结果如何?很难比 numpy 快……至少在 python 中。 ;)
-
@tryptofame 只是尝试使用非平凡大小的框架进行基准测试,下面的两个解决方案都会快得多)
标签: python numpy pandas conditional transformation