python - 如何通过其他列的条件按行值提取数据框?
问题描述
我有一个数据框如下:
#values
a=["003C", "003P1", "003P1", "003P1", "004C", "004P1", "004P2", "003C", "003P2", "003P1", "003C", "003P1", "003P2", "003C", "003P1", "004C", "004P2", "001C", "001P1"]
b=["chr18", "chr20", "chr8", "chr8", "chr11", "chr11", "chr11", "chr11", "chr11", "chr11", "chr1", "chr1", "chr1", "chr1", "chr1", "chr11", "chr11", "chr9", "chr9"]
c=[48399,145653,244695,244695,1163940,1163940,1163940,5986513,5986513,5986513,248650751,248650751,248650751,125895,125895,2587895,2587895,14587952,14587952]
d=["C", "G", "C", "C", "C", "C", "C", "G", "G", "G", "T", "T", "T", "T", "T", "C", "C", "T", "T"]
e=["A", "T", "A", "A", "G", "G", "G", "A", "A", "A", "A", "A", "A", "A", "A", "G", "G", "C", "C"]
#Make dataframe
df = pd.DataFrame({'Sample':a, 'CHROM':b, 'POS':c, 'REF':d, 'ALT':e})
df
Sample CHROM POS REF ALT
0 003C chr18 48399 C A
1 003P1 chr20 145653 G T
2 003P1 chr8 244695 C A
3 003P1 chr8 244695 C A
4 004C chr11 1163940 C G
5 004P1 chr11 1163940 C G
6 004P2 chr11 1163940 C G
7 003C chr11 5986513 G A
8 003P2 chr11 5986513 G A
9 003P1 chr11 5986513 G A
10 003C chr1 248650751 T A
11 003P1 chr1 248650751 T A
12 003P2 chr1 248650751 T A
13 003C chr1 125895 T A
14 003P1 chr1 125895 T A
15 004C chr11 2587895 C G
16 004P2 chr11 2587895 C G
17 001C chr9 14587952 T C
18 001P1 chr9 14587952 T C
我想提取与common 与or或&匹配'CHROM' 'POS' 'REF' 'ALT'
的数据框。例如:有其对应的 003P1 或 003P2 与所有匹配值参见索引和和。我想把它们全部提取出来:df['Sample']
C
P1
P2
P1
P2
003C
'CHROM' 'POS' 'REF' 'ALT'
7,8,9
13,14
10,11,12
预期的输出是:
Sample CHROM POS REF ALT
0 003C chr1 125895 T A
1 003P1 chr1 125895 T A
2 004C chr11 1163940 C G
3 004P1 chr11 1163940 C G
4 004P2 chr11 1163940 C G
5 004C chr11 2587895 C G
6 004P2 chr11 2587895 C G
7 003C chr11 5986513 G A
8 003P2 chr11 5986513 G A
9 003P1 chr11 5986513 G A
10 001C chr9 14587952 T C
11 001P1 chr9 14587952 T C
12 003C chr1 248650751 T A
13 003P1 chr1 248650751 T A
14 003P2 chr1 248650751 T A
我尝试了以下代码:
df[['INT','STR']] = df['Sample'].str.extract('(\d+)(.*)')
df = df[df.groupby(['CHROM', 'POS', 'REF', 'ALT', 'INT'])['STR'].transform('size').eq(3)]
但它的拉力只在所有三种喜欢中都C, P1 and P2
没有C, P1 or P2
。
任何帮助表示赞赏。谢谢
解决方案
解决方案
c = ['CHROM', 'POS', 'REF', 'ALT', 'INT']
df[['INT','STR']] = df['Sample'].str.extract(r'(\d+)(.*)')
m = df['STR'].isin(['C', 'P1', 'P2'])
m1 = df['STR'].eq('C').groupby([*df[c].values.T]).transform('any')
m2 = df['STR'].mask(~m).groupby([*df[c].values.T]).transform('nunique').ge(2)
df = df[m & m1 & m2].sort_values('POS', ignore_index=True).drop(['INT', 'STR'], 1)
解释
Extract
列INT
并STR
使用str.extract
正则表达式模式
>>> df[['INT','STR']]
INT STR
0 003 C
1 003 P1
2 003 P1
3 003 P1
4 004 C
5 004 P1
6 004 P2
7 003 C
8 003 P2
9 003 P1
10 003 C
11 003 P1
12 003 P2
13 003 C
14 003 P1
15 004 C
16 004 P2
17 001 C
18 001 P1
创建一个布尔掩码,isin
用于检查提取的列STR
仅包含值的条件C
,P1
以及P2
>>> m
0 True
1 True
2 True
3 True
4 True
5 True
6 True
7 True
8 True
9 True
10 True
11 True
12 True
13 True
14 True
15 True
16 True
17 True
18 True
Name: STR, dtype: bool
将STR
列与C
创建布尔掩码进行比较,然后将此掩码分组到列上['CHROM', 'POS', 'REF', 'ALT', 'INT']
并转换使用any
以创建布尔掩码m1
>>> m1
0 True
1 False
2 False
3 False
4 True
5 True
6 True
7 True
8 True
9 True
10 True
11 True
12 True
13 True
14 True
15 True
16 True
17 True
18 True
Name: STR, dtype: bool
STR
屏蔽布尔掩码所在的m1
列中的值,False
然后将此屏蔽列分组['CHROM', 'POS', 'REF', 'ALT', 'INT']
并使用nunique
然后链转换ge
以创建布尔掩码m2
>>> m2
0 False
1 False
2 False
3 False
4 True
5 True
6 True
7 True
8 True
9 True
10 True
11 True
12 True
13 True
14 True
15 True
16 True
17 True
18 True
Name: STR, dtype: bool
现在使用logical and
掩码m
,m1
和m2
, 并使用它来过滤数据框中所需的行
>>> df[m & m1 & m2].sort_values('POS', ignore_index=True).drop(['INT', 'STR'], 1)
Sample CHROM POS REF ALT
0 003C chr1 125895 T A
1 003P1 chr1 125895 T A
2 004C chr11 1163940 C G
3 004P1 chr11 1163940 C G
4 004P2 chr11 1163940 C G
5 004C chr11 2587895 C G
6 004P2 chr11 2587895 C G
7 003C chr11 5986513 G A
8 003P2 chr11 5986513 G A
9 003P1 chr11 5986513 G A
10 001C chr9 14587952 T C
11 001P1 chr9 14587952 T C
12 003C chr1 248650751 T A
13 003P1 chr1 248650751 T A
14 003P2 chr1 248650751 T A
推荐阅读
- java - Binary Search Query:在两个有序数组中查找中间项
- javascript - 如何返回特定索引处的字符?
- docker - 当lets-encrypt-nginx-proxy-companion更新我的证书时如何触发容器重启
- javascript - Node.js [网络库]:如何将缓冲区对象变成字符串?
- python - Django:将外键添加到表单-> 无法分配“
用户在具有 in id(父表/模型)的患者的 DetailView 中,或选择患者创建子(表/模型)对象(我希望这是准确的术语)。我正在尝试使用父表中的正确外键“预填充”我的表单。基本上,每个患者都会有几次访问,并且访问需要与患者表(“主”模型)具有正确的外键关系。
- python - pyqtgraph ImageView 和彩色图像
- php - 我需要关于在 php 上解析 json url 的帮助
- python-3.x - 没有 lambda 是否可以实现单行 python 闭包?
- lucene - Apache Lucene 忽略日期范围搜索表达式中的月份和日期
- apache-spark - 如何在pyspark中获取火花执行器进程PID