我有两个版本的函数,Pandas
使用Python 2.7
逐行查看inputs.csv
。
第一个版本在Series.apply()
上使用single column
,并按预期浏览每一行。
第二个版本在DataFrame.apply()
上使用multiple columns
,由于某种原因,它会两次读取顶行。然后继续执行其余的行而不重复。
为什么后者会两次读取顶行的任何想法?
版本#1 - Series.apply()
(读取顶行一次)
import pandas as pd
df = pd.read_csv(inputs.csv, delimiter=",")
def v1(x):
y = x
return pd.Series(y)
df["Y"] = df["X"].apply(v1)
版本#2 - DataFrame.apply()
(两次读取顶行)
import pandas as pd
df = pd.read_csv(inputs.csv, delimiter=",")
def v2(f):
y = f["X"]
return pd.Series(y)
df["Y"] = df[(["X", "Z"])].apply(v2, axis=1)
print y
:
v1(x): v2(f):
Row_1 Row_1
Row_2 Row_1
Row_3 Row_2
Row_3
答案 0 :(得分:11)
答案 1 :(得分:1)
在提供的链接中,我真诚地看不到对此的任何解释,但是无论如何:我偶然发现了我的代码中的相同内容,做了最愚蠢的事情,即,将第一个电话短路。但这有效。
is_first_call = True
def refill_uniform(row, st=600):
nonlocal is_first_call
if is_first_call:
is_first_call = False
return row
...代码如下
答案 2 :(得分:1)
我今天也遇到了同样的问题,我花了几个小时在Google上寻找解决方案。最后,我想出了一个解决方案,
import numpy as np
import pandas as pd
import time
def foo(text):
text = str(text) + ' is processed'
return text
def func1(data):
print("run1")
return foo(data['text'])
def func2(data):
print("run2")
data['text'] = data['text'] + ' is processed'
return data
def test_one():
data = pd.DataFrame(columns=['text'], index=np.arange(0, 3))
data['text'] = 'text'
start = time.time()
data = data.apply(func1, axis = 1)
print(time.time() - start)
print(data)
def test_two():
data = pd.DataFrame(columns=['text'], index=np.arange(0, 3))
data['text'] = 'text'
start = time.time()
data = data.apply(func2, axis=1)
print(time.time() - start)
print(data)
test_one()
test_two()
如果运行程序,您将看到如下结果:
run1
run1
run1
0.0029706954956054688
0 text is processed
1 text is processed
2 text is processed
dtype: object
run2
run2
run2
run2
0.0049877166748046875
text
0 text is processed is processed
1 text is processed
2 text is processed
通过将函数(func2)分为func1和foo,它仅在第一行运行一次。