我得到这个数据集,当值为空时,它有一个符号-
一开始我觉得没问题,所以放下这些行:

df_c = df[df != '-']

但实际上它并没有删除行,而是用一个nan代替-
然后我做了:
df_c = df_c[df_c.notnull()]

但它不起作用,它又把我还给了我。
我做错什么了?

最佳答案

mask+dropna
您可以使用布尔数据帧进行屏蔽,然后使用dropna

df = pd.DataFrame({'A': [1, '-', '-', 4, '-'],
                   'B': ['A', 'B', '-', 'C', '-'],
                   'C': [0.5, '-', '-', 1.5, 2.5]})

df = df.mask(df == '-').dropna()

print(df)

   A  B    C
0  1  A  0.5
3  4  C  1.5

默认情况下,dropna删除任何值为空(axis=0)的行(how='any')。您可以根据需要修改这些参数。
注:这在功能上与df = df[df != '-'].dropna()相同不过,从表面上看,mask的意图似乎更为明确。
您的解决方案的问题是df_c.notnull()提供了一个布尔数据帧数组,但您希望通过一维数组/序列进行索引。您可以使用:
df_c = df[df != '-']
df_c = df_c[df_c.notnull().all(1)]

但这是冗长的,而且可能效率低下。

08-24 23:56