从python pandas数据框中删除一些元素

时间:2019-02-13 11:16:33

标签: python pandas dataframe

我有一个具有20000行和5列的Excel工作表。该数据帧包含几个-9值。我想删除那些-9而不替换其位置上的任何其他值。

下面是示例数据框:

a   b   c
1   3   -9
-9   2   8
5   -9   -9
-9   0   2

我需要一个如下所示的数据框:

a b c 1 3 2 8 5 0 2

以下是输出文件的一部分: 23799 1 11 1.000000 0.1 0.133 1 0.867 0.5 0 23800 2 2 0.100000 0.1 0.133 1 0.867 0.5 0 11 0.900000 0.1 0.133 1 0.867 0.5 0 23801 2 2 0.200000 0.1 0.133 1 0.867 0.5 0 11 0.800000 0.1 0.133 1 0.867 0.5 0 23802 2 2 0.200000 0.1 0.133 1 0.867 0.5 0 11 0.800000 0.1 0.133 1 0.867 0.5 0 23803 3 2 0.600000 0.1 0.133 1 0.867 0.5 0 10 0.100000 0.1 0.173 1 0.827 0.5 0 11 0.300000 0.1 0.133 1 0.867 0.5 0 23804 2 2 0.400000 0.1 0.133 1 0.867 0.5 0 11 0.600000 0.1 0.133 1 0.867 0.5 0 23805 2 2 0.500000 0.1 0.133 1 0.867 0.5 0 11 0.500000 0.1 0.133 1 0.867 0.5 0 23806 3 5 0.100000 0.1 0.1 1 0.9 0.5 0 9 0.400000 0.1 0.089 1 0.889 0.5 0.022 11 0.500000 0.1 0.133 1 0.867 0.5 0 23807 2 5 0.400000 0.1 0.1 1 0.9 0.5 0 9 0.600000 0.1 0.089 1 0.889 0.5 0.022 23808 2 5 0.200000 0.1 0.1 1 0.9 0.5 0 9 0.800000 0.1 0.089 1 0.889 0.5 0.022

3 个答案:

答案 0 :(得分:0)

我相信您需要所有具有至少一个值-9的行-通过boolean indexing进行过滤:

df = df[df.ne(-9).all(axis=1)]
print (df)
   a  b
0  1  3

详细信息

检查值是否等于-9:

print (df.ne(-9))
       a      b
0   True   True
1  False   True
2   True  False
3  False  False

检查每行是否所有True:

print (df.ne(-9).all(axis=1))
0     True
1    False
2    False
3    False
dtype: bool

无法替换为任何内容,需要替换为0NaN或某个值:

print (df.replace(-9, np.nan))
     a    b
0  1.0  3.0
1  NaN  2.0
2  5.0  NaN
3  NaN  NaN

只有方法可以重塑-通过melt在2列中创建2列,所有数值都包含在内:

df1 = df.melt(var_name='A', value_name='B')
df1 = df1[df1['B'] != -9]
print (df1)
    A  B
0   a  1
2   a  5
4   b  3
5   b  2
7   b  0
9   c  8
11  c  2

答案 1 :(得分:0)

从评论到@jezrael的答案,您似乎希望将结果导出为文本文件(例如csv或tsv)。由于您不打算在熊猫中使用数据框,因此我将使用简单的replace

df = pd.DataFrame(
    [[1, 3, -9], [-9, 2, 8], [5, -9, -9], [-9, 0, 2]],
    columns=("a", "b", "c"),
)
df.replace(to_replace=-9, value='')
  .to_csv('/tmp/foo.csv', index=False)

导出的csv如下:

a,b,c
1,3,
,2,8
5,,
,0,2

答案 2 :(得分:0)

使用布尔索引进行此操作的另一种方法:

DataFrame示例:

>>> df
   a  b  c
0  1  3 -9
1 -9  2  8
2  5 -9 -9
3 -9  0  2

结果:

>>> df[df < 0] = ''
>>> df
   a  b  c
0  1  3
1     2  8
2  5
3     0  2

第二,因为其他方法已经包含了replace方法,但是我想添加补充值以实现所需的效果,首先将您的负数转换为Nan,同时用''填充Nan值以获得期望的:

结果输出:

>>> df.replace(-9, np.nan).fillna('')
   a  b  c
0  1  3
1     2  8
2  5
3     0  2