将函数应用于pandas数据帧

时间:2014-01-21 21:35:53

标签: python pandas

我正在尝试对pandas dataframe执行一些文本分析,但是我遇到了一些问题。或者,也许我只是没有得到它... PS - 我是一个蟒蛇初学者 - 是。

Dataframe示例:

df = pd.DataFrame({'Document' : ['a','1','a', '6','7','N'], 'Type' : ['7', 'E', 'Y', '6', 'C', '9']})


     Document   Type
0    a          7
1    1          E
2    a          Y
3    6          6
4    7          C
5    N          9

我正在尝试构建一个流程,如果'Document'或'Type'是一个数字或不是,请做点什么。

这是一个简单的函数,用于返回'Document'是否为数字(编辑以显示我如何在场上尝试一些if / then flow):

def fn(dfname):
    if dfname['Document'].apply(str.isdigit):
        dfname['Check'] = 'Y'
    else:
        dfname['Check'] = 'N'

现在,我apply到数据帧:

df.apply(fn(df), axis=0)

我收到此错误:

TypeError: ("'NoneType' object is not callable", u'occurred at index Document')

从错误消息中,它看起来我没有正确处理索引。谁能看到我错在哪里?

最后 - 这可能与此问题有关,也可能与此无关,但我真的在indexes pandas工作{{1}}。我认为我遇到的索引问题比任何其他问题都多。

2 个答案:

答案 0 :(得分:5)

你很亲密。

你需要了解的关于apply的事情是你需要编写对标量值进行操作的函数并返回你想要的结果。考虑到这一点:

import pandas as pd

df = pd.DataFrame({'Document' : ['a','1','a', '6','7','N'], 'Type' : ['7', 'E', 'Y', '6', 'C', '9']})

def fn(val):
    if str(val).isdigit():
        return 'Y'
    else:
        return 'N'

df['check'] = df['Document'].apply(fn)

给了我:

  Document Type check
0        a    7     N
1        1    E     Y
2        a    Y     N
3        6    6     Y
4        7    C     Y
5        N    9     N

编辑:

只是想澄清一下,在系列中使用apply时,您应该编写接受标量值的函数。但是,在DataFrame上使用apply时,函数应接受完整列(axis=0 - 默认值)或完整行(axis=1时)。

答案 1 :(得分:3)

值得注意的是,您可以使用str.contains执行此操作(不使用apply,因此更有效):

In [11]: df['Document'].str.contains('^\d+$')
Out[11]: 
0    False
1     True
2    False
3     True
4     True
5    False
Name: Document, dtype: bool

这里正则表达式^和$分别表示开始和结束。