【发布时间】:2017-10-18 23:01:45
【问题描述】:
根据以下数据:
data01 =
pos ids sample1_value sample2_value
2969 a:b:c 12:13:15 12:13:15
3222 a:b:c 13:13:16 21:33:41
3416 a:b:c 19:13:18 21:33:41
5207 a:b:c 11:33:41 91:33:41
5238 a:b:c 21:13:45 31:27:63
5398 a:b:c 31:27:63 28:63:41
5403 a:b:c 15:7:125 71:33:41
5426 a:b:c 12:13:25 82:25:14
5434 a:b:c 12:17:15 52:33:52
假设我为每个样本计算了另一个 id (d) 值,但不是在每一行中。
data02 =
pos ids sample1_value sample2_value
2969 d 21 96
3416 d 52 85
5207 d 63 85
5398 d 27 52
5403 d 63 52
5434 d 81 63
问题:
我想为每个样本的每一行写下这个 d 值。
是否可以使用 for 循环将值写回?
预期的最终输出:
pos ids sample1_value sample2_value
2969 a:b:c:d 12:13:15:21 12:13:15:.
3222 a:b:c:d 13:13:16:. 21:33:41:.
3416 a:b:c:d 19:13:18:52 21:33:41:.
................................
.......................... in the same way as above
我只为 sample01 尝试了以下代码:
data01 = open('data01.txt', 'r')
header01 = data01.readline()
data01 = data01.read().rstrip('n').split('\n')
# similar code for data02
data01_new = open('data01_new.txt', 'w')
data01_new.write(header01 + '\n')
for lines in data01:
values01 = lines.split('\t')
pos01 = values01[0]
ids01 = values01[1]
sample1_val01 = values01[2]
for lines in data02:
values02 = lines.split('\t')
pos02 = values02[0]
ids02 = values02[1]
sample1_val02 = values02[2]
if pos01 == pos02:
data01_update = open('data01_new.txt', 'a')
data01_update.write('\t'.join(pos1, (ids01+':'+ids02), sample1_val01+':'+sample1_val02)
else:
data01_update = open('data01_new.txt', 'a')
data01_update.write('\t'.join(pos1, (ids01+':'+ids02), sample1_val01+':'+'.')
- 我知道嵌套循环使用文件大小的乘积会浪费大量时间。
- 我的 if/else 逻辑用匹配更新行,但后来被不匹配覆盖。
是否可以使用for-loop and if-else 解决此问题?
如果没有,我该如何使用 pandas 解决这个问题?
【问题讨论】:
-
两个文件中的 pos 值是否保证顺序相同——比如说,整数递增?
-
更新文件可以有新的pos值吗?
-
是的,pos 值将按升序排列。更新文件将包含 data01 中的所有 pos 值。为了清楚起见(data02 具有来自 data01 的 pos 值的子集),因此所有 pos02 都将在 pos1 中,但并非所有 pos1 都将在 pos2 中。
-
太棒了。是的,您给定的代码不是最佳的。给我一个小时……
-
是的,我知道这是次优的。想了一天,还是解决不了。另外,如果您有熊猫知识,我想比较一下我自己学习的代码。我希望不要问太多,但任何建议都是感激的。竖起大拇指!
标签: python pandas for-loop if-statement merge