【问题标题】:Drop rows with a 'question mark' value in any column in a pandas dataframe在熊猫数据框中的任何列中删除带有“问号”值的行
【发布时间】:2016-02-28 12:47:36
【问题描述】:

我想删除任何列中的所有行(或不带问号的所有行)。我还想将元素更改为 float 类型。

输入:

X Y Z
0 1 ?
1 2 3
? ? 4
4 4 4
? 2 5

输出:

X Y Z
1 2 3
4 4 4

最好使用 pandas 数据帧操作。

【问题讨论】:

  • out = df.replace({'?': numpy.nan}).dropna().astype(float)
  • 它与下面的答案相同,但非常适合单行。谢谢

标签: python pandas dataframe


【解决方案1】:

您可以尝试首先在列中查找字符串 ?,创建布尔掩码和最后一个过滤器行 - 使用 boolean indexing。如果您需要将列转换为float,请使用astype

print ~((df['X'] == '?' )  (df['Y'] == '?' ) | (df['Z'] == '?' ))
0    False
1     True
2    False
3     True
4    False
dtype: bool


df1 = df[~((df['X'] == '?' ) | (df['Y'] == '?' ) | (df['Z'] == '?' ))].astype(float)
print df1
   X  Y  Z
1  1  2  3
3  4  4  4

print df1.dtypes
X    float64
Y    float64
Z    float64
dtype: object

或者你可以试试:

df['X'] = pd.to_numeric(df['X'], errors='coerce')
df['Y'] = pd.to_numeric(df['Y'], errors='coerce')
df['Z'] = pd.to_numeric(df['Z'], errors='coerce')
print df
    X   Y   Z
0   0   1 NaN
1   1   2   3
2 NaN NaN   4
3   4   4   4
4 NaN   2   5
print ((df['X'].notnull() ) & (df['Y'].notnull() ) & (df['Z'].notnull() ))
0    False
1     True
2    False
3     True
4    False
dtype: bool

print df[ ((df['X'].notnull() ) & (df['Y'].notnull() ) & (df['Z'].notnull() )) ].astype(float)
   X  Y  Z
1  1  2  3
3  4  4  4

使用更好:

df = df[(df != '?').all(axis=1)]

或者:

df = df[~(df == '?').any(axis=1)]

【讨论】:

  • 我得到一个 TypeError: invalid type comparison
  • ? 的值类型是什么?试试看print type(df.at[0,'Z']) - 有?
  • 它适用于一列。所以它删除了一个布尔索引器的行。但是一旦我使用 | (或)它失败了
  • 嗯,请检查(),可能是错字。
  • 当我尝试打印出 ?标记它告诉我这个:KeyError:0L
【解决方案2】:

您可以尝试将? 替换为空值

import numpy as np

data = df.replace("?", "np.Nan")

如果你想替换特定的列试试这个:

data = df["column name"].replace("?", "np.Nan")

【讨论】:

    【解决方案3】:

    在 pandas 数据框中的任何列中删除带有“问号”值的行

    import numpy as np 
    import pandas as pd 
     
    df = pd.DataFrame(columns=["col1", "col2"]) 
    df.loc[0] = [ "foo",  "bar" ] 
    df.loc[1] = [ "f?oo", "bar" ] 
    df.loc[2] = [ "foo",  "?ba?"] 
    df.loc[3] = [ "foo",  "?"] 
    df.loc[4] = [ np.nan,  "bar"] 
    print(df) 
     
    df = df.replace("?", np.nan) 
    df = df.dropna() 
    print(df) 
    

    打印:

       col1  col2
    0   foo   bar
    1  f?oo   bar
    2   foo  ?ba?
    3   foo     ?
    4   NaN   bar
    
       col1  col2
    0   foo   bar
    1  f?oo   bar
    2   foo  ?ba?
    

    【讨论】:

      猜你喜欢
      • 2022-06-10
      • 1970-01-01
      • 1970-01-01
      • 2021-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-07
      • 2016-05-07
      相关资源
      最近更新 更多