按行总和和值过滤
Filter by row sum and value
我正在尝试过滤 DataFrame
中的行。我必须过滤掉所有总和为 0 的 rows
以及所有 5% 或更多的值等于 0 的 rows
。
DataFrame
是 50000 rows
x 120 columns
。我设法 filter
将 sum
的所有 rows
设为 0,但不是那些有 5% 或更多的值等于 0 的 rows
。
import pandas as pd
df = pd.read_csv("file.
a = df[df.sum(axis=1) > 0]
gene1 0.000000 0.000000 4108.683105 41.675945 0.000000
gene2 2650.009521 3437.226807 20.767439 0.000000 902.217712
您可以使用 .mask()
:
过滤掉 non-zero 个值
masked = df.mask(df!=0)
如果您然后 .count(axis=1)
,您会得到每个 row
的 non-zero 个值的计数,并且可以通过将结果与 column
count
.
使用以下示例数据:
df = pd.DataFrame(np.random.randint(low=0, high=10, size=(100, 50)))
df_colcount = float(len(df.columns))
df['zero_count'] = df.mask(df!=0).count(axis=1)
df['zero_share'] = df.mask(df!=0).count(axis=1).div(df_colcount)
从这里您可以过滤您需要的行:
df[df.zero_share < 0.05]
0 1 2 3 4 5 6 7 8 9 ... 42 43 44 45 46 47 48 49 \
0 4 0 3 1 6 4 5 8 8 9 ... 4 7 9 4 5 9 4 5
8 7 1 2 1 5 2 4 4 5 7 ... 5 6 3 3 3 4 9 4
19 6 6 2 9 2 4 9 8 6 1 ... 2 6 5 9 4 9 7 5
23 7 8 4 1 4 5 6 5 5 5 ... 3 8 9 8 5 5 5 3
53 3 7 9 5 0 2 3 3 3 1 ... 5 4 7 1 2 7 7 1
70 7 9 6 4 4 8 6 3 1 3 ... 1 1 1 9 1 3 1 5
77 4 4 2 4 2 9 8 2 6 8 ... 8 8 7 8 2 3 5 9
85 5 7 0 4 6 2 6 5 7 8 ... 9 8 6 6 2 4 5 5
98 9 9 6 6 4 7 9 1 6 4 ... 4 6 1 2 4 1 8 1
zero_count zero_share
0 2 0.04
8 1 0.02
19 2 0.04
23 2 0.04
53 2 0.04
70 1 0.02
77 2 0.04
85 2 0.04
98 1 0.02
您当然可以一步完成所有这些:
df[df.mask(df!=0).count(axis=1).div(float(len(df.columns))) < 0.05]
或者,您确实可以应用掩码来识别具有 non-zero 值和 .mask(df==0)
的 rows
,然后仅保留具有超过 95% 的此类值的那些。这些是获得相同结果的等效方法。
我正在尝试过滤 DataFrame
中的行。我必须过滤掉所有总和为 0 的 rows
以及所有 5% 或更多的值等于 0 的 rows
。
DataFrame
是 50000 rows
x 120 columns
。我设法 filter
将 sum
的所有 rows
设为 0,但不是那些有 5% 或更多的值等于 0 的 rows
。
import pandas as pd
df = pd.read_csv("file.
a = df[df.sum(axis=1) > 0]
gene1 0.000000 0.000000 4108.683105 41.675945 0.000000
gene2 2650.009521 3437.226807 20.767439 0.000000 902.217712
您可以使用 .mask()
:
masked = df.mask(df!=0)
如果您然后 .count(axis=1)
,您会得到每个 row
的 non-zero 个值的计数,并且可以通过将结果与 column
count
.
使用以下示例数据:
df = pd.DataFrame(np.random.randint(low=0, high=10, size=(100, 50)))
df_colcount = float(len(df.columns))
df['zero_count'] = df.mask(df!=0).count(axis=1)
df['zero_share'] = df.mask(df!=0).count(axis=1).div(df_colcount)
从这里您可以过滤您需要的行:
df[df.zero_share < 0.05]
0 1 2 3 4 5 6 7 8 9 ... 42 43 44 45 46 47 48 49 \
0 4 0 3 1 6 4 5 8 8 9 ... 4 7 9 4 5 9 4 5
8 7 1 2 1 5 2 4 4 5 7 ... 5 6 3 3 3 4 9 4
19 6 6 2 9 2 4 9 8 6 1 ... 2 6 5 9 4 9 7 5
23 7 8 4 1 4 5 6 5 5 5 ... 3 8 9 8 5 5 5 3
53 3 7 9 5 0 2 3 3 3 1 ... 5 4 7 1 2 7 7 1
70 7 9 6 4 4 8 6 3 1 3 ... 1 1 1 9 1 3 1 5
77 4 4 2 4 2 9 8 2 6 8 ... 8 8 7 8 2 3 5 9
85 5 7 0 4 6 2 6 5 7 8 ... 9 8 6 6 2 4 5 5
98 9 9 6 6 4 7 9 1 6 4 ... 4 6 1 2 4 1 8 1
zero_count zero_share
0 2 0.04
8 1 0.02
19 2 0.04
23 2 0.04
53 2 0.04
70 1 0.02
77 2 0.04
85 2 0.04
98 1 0.02
您当然可以一步完成所有这些:
df[df.mask(df!=0).count(axis=1).div(float(len(df.columns))) < 0.05]
或者,您确实可以应用掩码来识别具有 non-zero 值和 .mask(df==0)
的 rows
,然后仅保留具有超过 95% 的此类值的那些。这些是获得相同结果的等效方法。