Pandas函数:DataFrame.apply()运行顶行两次

时间:2015-08-07 12:38:24

标签: python pandas

我有两个版本的函数,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

3 个答案:

答案 0 :(得分:11)

这是设计的,如herehere

所述

apply函数需要知道返回数据的形状,以智能地确定它将如何组合。应用是一种智能应用聚合,转换或过滤的快捷方式。您可以尝试分解您的功能,以避免重复调用。

答案 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,它仅在第一行运行一次。