python - 如何根据其他列的多个突发事件转换列?
问题描述
我有一个数据框:
df = pd.DataFrame({'REF':list('GCTT'), 'ALT':list('AACG'),
'A1':['0/1','0/1','0/0','0/1'],
'A2':['1/1','0/1','0/1','0/0']})
REF ALT A1 A2
0 G A 0/1 1/1
1 C A 0/1 0/1
2 T C 0/0 0/1
3 T G 0/1 0/0
我想根据 REF 和 ALT 列中的值转换 A1 和 A2 列。因此,第 0 行中的 A1 和 A2 列应为 GA 和 AA。即丢失“/”并用 G 替换 0,用 A 替换 1。接下来,第 1 行应该用 C 替换 0,用 A 替换 1。然后按照下一行的模式,得到:
REF ALT A1 A2
0 G A GA AA
1 C A CA CA
2 T C TT TC
3 T G TG TT
在我的数据中有数百个A列:A1,A2......An-1,An。因此,解决方案需要在所有列中都可复制。
解决方案
I wonder how fast this solution is with your data:
for col in ["A1","A2"]:
df[col]= df[col].str.split("/",expand=True) \
.replace(["0","1"],[df.REF,df.ALT]) \
.agg("".join,axis=1)
df
REF ALT A1 A2
0 G A GA AA
1 C A CA CA
2 T C TT TC
3 T G TG TT
编辑:解决方案 2.,使用索引:
# helper structs:
ncbscols= ["REF","ALT"]
cols= df.columns.difference(ncbscols)
ii= pd.MultiIndex.from_product([list("ACGT"),list("ACGT"),["0/0","0/1","1/1","1/0"] ])
ser= pd.Series( [t[2].replace("/","").replace("0",t[0]).replace("1",t[1]) for t in ii ], index=ii )
# the main calculation:
for c in cols:
mi= pd.MultiIndex.from_arrays([ df.REF.values,df.ALT.values,df[c].values ])
df[c]= ser[mi].values
ser:
A A 0/0 AA
0/1 AA
1/1 AA
1/0 AA
C 0/0 AA
..
T G 1/0 GT
T 0/0 TT
0/1 TT
1/1 TT
1/0 TT
Length: 64, dtype: object
df:
REF ALT A1 A2
0 G A GA AA
1 C A CA CA
2 T C TT TC
3 T G TG TT
推荐阅读
- vega-lite - 如何在 vega-lite 中突出显示放大的栏并了解该栏的详细信息?
- ipfs - IPFS 私网连接超时
- kubernetes - 持久卷和持久卷声明如何在 Kubernetes 中相互绑定
- ios - 如何在重新加载 CollectionView 时防止单元格内的代码运行
- javascript - 如何根据javascript中的权重值从数组中获取n个值
- css - 如何响应地设置 Material-UI 的 Grid 项目的高度等于其宽度?
- python-3.x - 下面的代码给了我错误,例如“视图 home.views.edit 没有返回 HttpResponse 对象。它返回了 None 。”
- react-native - React-Native 购物车 - 无法将数据传递到购物车屏幕
- macos - 无法在 macos 上安装/链接 wget
- apache-spark - 在 Pyspark 中从 Rest Api 创建数据框时出错