在Pandas数据框列中存储仅数字或字母的值?

时间:2017-11-19 20:31:29

标签: python pandas dataframe filter

想象一下,我有一个名为courses的列,其中一些只是数字,有些是按字母顺序排列,有些是两者。这些对应于特定部门的课程。想象一下courses中的所有值都是字符串,可能有空值。我想a)存储仅数字的课程b)存储仅按字母顺序排列的课程或c)存储以数字结尾的课程(但我们不关心它们是否包含数字或字母)。我怎么能利用熊猫的能力呢?

想象一下,courses看起来像这样,但更长。

Courses
------------------------
181
71
CS 143
Machine Learning
Programming Languages 79
115
157 Neural Networks

所以a)将包含181,71,115 b)将包含机器学习,c)将包含编程语言79,CS 143.

我可以想象使用非熊猫方法这样做的时间更长,但我想大熊猫可以帮助我做到这一点。例如,对于最后一项任务,我可以按照以下方式做一些事情,但我想知道是否有更好的方法:

c = []
for course in courses:
    course = course.strip()
    if course:
        length = len(course) - 1
        if (course[length]).isdigit():
            c.append(course)

1 个答案:

答案 0 :(得分:2)

使用contains作为布尔掩码:

m1 = df['Courses'].str.contains('^\d+$')
m2 = df['Courses'].str.contains('\d')
m3 = df['Courses'].str.contains('^\D.*\d$')

df1 = df[m1]
print (df1)
  Courses
0     181
1      71
5     115

df2 = df[~m2]
print (df2)
            Courses
3  Machine Learning

df3 = df[m3]
print (df3)
                    Courses
2                    CS 143
4  Programming Languages 79

如果您需要单个数据帧作为输出,则可以使用单个正则表达式:

df[df.Courses.str.contains(r'^(?:\d+|[a-zA-Z\s]+|.*\d)$')]

                    Courses
0                       181
1                        71
2                    CS 143
3          Machine Learning
4  Programming Languages 79
5                       115