我有一个具有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
答案 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
无法替换为任何内容,需要替换为0
或NaN
或某个值:
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)
使用布尔索引进行此操作的另一种方法:
>>> 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