将一个函数应用于pandas数据帧

3

我正在尝试对一个 pandas 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

我想构建一个流程,如果“文档”或“类型”是数字或不是数字,就会执行某些操作。

这里有一个简单的函数来返回“文档”是否为数字(已编辑以显示如何在该字段上尝试一些if/then流程):

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

现在,我将应用它到数据框中:

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

我收到了以下错误信息:
TypeError: ("'NoneType' object is not callable", u'occurred at index Document')

根据错误信息,似乎我没有正确处理索引。有人能看出我哪里出了错吗?

最后,这可能与问题有关,但我真的很难理解 pandas 中的 indexes 如何工作。我认为我遇到的问题中,索引引起的问题比任何其他问题都要多。


你应该使用bool而不是'Y'和'N'...! - Andy Hayden
2个回答

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时,应编写接受标量值的函数。然而,在数据框上使用apply时,函数应该接受完整的列(当axis = 0 - 默认)或完整的行(当axis=1)。


谢谢,那真的很有帮助。 - mikebmassey
好的 - 我想我刚刚搞明白了 - 要在数据框上使用函数,你必须使用(应该使用)apply。因此,我可以通过在主函数中使用apply来链接函数。对吗(这有意义吗)? - mikebmassey
@mikebmassey 这在理论上听起来是可能的,但同时也听起来很混乱。我会避免这种情况。 - Paul H

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

这里的正则表达式^和$分别表示开头和结尾。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接