我正在尝试对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}}。我认为我遇到的索引问题比任何其他问题都多。
答案 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
这里正则表达式^和$分别表示开始和结束。