如何删除仅包含特定值的行?

2024-06-26 14:04:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个这样的数据帧

    column_name 
0   OnePlus phones never fail to meet my expectatiion.  
1   received earlier than expected for local set.   
2   \n  
3   good    
4   must buy!
5   \t
6     
7   awesome product!  
8     \n    

我想删除其中只包含\n\t\n的所有行

输出应如下所示:

    column_name 
0   OnePlus phones never fail to meet my expectatiion.  
1   received earlier than expected for local set.   
2   good    
3   must buy!
4   awesome product!

我尝试了以下方法:

  df = df[df.column_name != '\n'].reset_index(drop=True)
  df = df[df.column_name != ''].reset_index(drop=True)
  df = df[df.column_name != ' '].reset_index(drop=True)
  df = df[df.column_name != '   '].reset_index(drop=True)
  df = df[df.column_name != ' \n '].reset_index(drop=True)

但是,有没有一种更优雅的方法或一种类似于Python的方法来代替重复代码呢


Tags: to方法nametruedfindexmycolumn
3条回答

您可以使用^{}并仅比较空字符串:

df1 = df[df.column_name.str.strip() != ''].reset_index(drop=True)

或将空值转换为布尔值:

df1 = df[df.column_name.str.strip().astype(bool)].reset_index(drop=True)

或者过滤词,对我来说是必要的strip(可能在真实数据中strip应该被删除):

df1 = df[df.column_name.str.strip().str.contains('\W', na=False)].reset_index(drop=True)

如果需要删除缺少的值且没有字符串值,请将这些值替换为NaNs,然后使用^{}

df.column_name = df.column_name.replace(r'^\s*$', np.nan, regex=True)
df1 = df.dropna(subset=['column_name']).reset_index(drop=True)

使用df.str.contains()检查正斜杠后是否有小的alpha

df[df.Column Name.str.contains('[\\][a-z]+',case=True, na=False, regex=True)]

在您的情况下,数据:

print(pd.DataFrame({'A':['OnePlus phones never fail to meet my expectatiion','received earlier than expected for local set.','\n','good','\t', np.nan,'must buy!','','awesome product!','\n' ]}))

                                               A
0  OnePlus phones never fail to meet my expectatiion
1      received earlier than expected for local set.
2                                                 \n
3                                               good
4                                                 \t
5                                                NaN
6                                          must buy!
7                                                   
8                                   awesome product!
9                                                 \n

解决方案

print(df[df.A.str.contains('[\\][a-z]+',case=True, na=False, regex=True)])



                             A
0  OnePlus phones never fail to meet my expectatiion
1      received earlier than expected for local set.
3                                               good
6                                          must buy!
8                                   awesome product!

另一种方法是删除条目与标记元素匹配的行:

df = df[~df['column_name'].isin(['\\n','\\t'])].dropna()

如果最后一行(或其他行)中有多余的空格,您可以首先执行以下操作:

df['column_name'] = df['column_name'].str.strip()

相关问题 更多 >