熊猫:如何删除系列中的非字母数字列

时间:2020-02-25 12:44:28

标签: python pandas dataframe series

熊猫系列可能包含无效值:

a     b     c     d      e      f     g 
1    ""   "a3"  np.nan  "\n"   "6"   " "
df = pd.DataFrame([{"a":1, "b":"", "c":"a3", "d":np.nan, "e":"\n", "f":"6", "g":" "}])
row = df.iloc[0]

我想生成一个干净的系列,仅保留包含数字值非空非空格字母数字字符串的列:

  • b应该被删除,因为它是一个空字符串;
  • d因为np.nan;
  • eg,因为只有空格的字符串。

预期结果:

a      c     f
1    "a3"   "6"

如何过滤包含数字或有效字母数字的列?

  • row.str.isalnum()NaN返回a,而不是我期望的True。
  • row.astype(str).str.isalnum()d的{​​{1}}更改为字符串np.nan,随后将其视为有效字符串。
  • "nan"当然只会丢弃row.dropna()d)。

我看不到https://pandas.pydata.org/pandas-docs/stable/reference/series.html

列出了太多其他可能性

作为一种解决方法,我可以循环使用items()检查类型和内容,并根据我想保留的值创建一个新的Series,但是这种方法效率低下(而且很丑陋):

np.nan

是否有任何布尔过滤器可以帮助我选出好的列?

2 个答案:

答案 0 :(得分:2)

将值转换为字符串并通过Series.notna与按位的AND-&链接另一个掩码:

row = row[row.astype(str).str.isalnum() & row.notna()]
print (row)
a     1
c    a3
f     6
Name: 0, dtype: object

答案 1 :(得分:2)

您可以使用正则表达式

row[row.notna() & row.astype(str).str.match('[a-zA-Z0-9]+')]