【发布时间】:2020-12-09 05:14:53
【问题描述】:
我有一个名为 All_samp 的数据框,如果同一行中的其他条目与不同行中的条目匹配,我想将列中的条目更改为最小值。例如,我有这个数据框
| index | chromosome | start | sample | no_calls |
|---|---|---|---|---|
| 22 | chr1 | 190098060 | 8.1 | 600 |
| 23 | chr1 | 190098060 | 9.1 | 858 |
| 24 | chr1 | 190098078 | 8.1 | 201 |
| 25 | chr1 | 190098093 | 8.1 | 250 |
| 26 | chr1 | 190098093 | 8.1 | 32 |
| 27 | chr1 | 190098093 | 8.1 | 271 |
| 28 | chr1 | 190098119 | 8.1 | 288 |
| 29 | chr1 | 190098123 | 10.1 | 146 |
| 30 | chr1 | 190098123 | 10.1 | 307 |
| 31 | chr10 | 190098123 | 8.1 | 366 |
| 32 | chr1 | 190098160 | 8.1 | 298 |
如果染色体、起始和样本匹配相同,那么我希望 no_calls 是匹配行的最小值。因此,这就是我要寻找的结果:
| index | chromosome | start | sample | no_calls |
|---|---|---|---|---|
| 22 | chr1 | 190098060 | 8.1 | 600 |
| 23 | chr1 | 190098060 | 9.1 | 858 |
| 24 | chr1 | 190098078 | 8.1 | 201 |
| 25 | chr1 | 190098093 | 8.1 | 32 |
| 26 | chr1 | 190098093 | 8.1 | 32 |
| 27 | chr1 | 190098093 | 8.1 | 32 |
| 28 | chr1 | 190098119 | 8.1 | 288 |
| 29 | chr1 | 190098123 | 10.1 | 146 |
| 30 | chr1 | 190098123 | 10.1 | 146 |
| 31 | chr10 | 190098123 | 10.1 | 366 |
| 32 | chr1 | 190098160 | 8.1 | 298 |
我尝试通过使用 itertuples 和嵌套循环制作一系列 no_calls 列来更改条目。有了这个,我应该能够用修改后的系列替换 no_calls 列。这就是我的代码的样子
no_calls = []
for row1 in All_samp.itertuples():
for row2 in All_samp.itertuples():
if row1[0] != row2[0] and (row1[1] == row2[1] and row1[2] == row2[2] and row1[3] == row2[3]):
print(row1[0], row2[0], row1[4], row2[4], min(row1[4], row2[4]))
no_calls.append(min(row1[4], row2[4]))
break
else:
no_calls.append(row1[4])
break
结果只是给了我一个原始 no_calls 条目的列表,我想这是因为我的“if”语句只经历了第一次迭代,而不是循环遍历所有行。一旦我让循环工作,我将用列表替换列
All_samp['no_calls'] = no_calls
如果有任何想法可以帮助我修复我的循环,甚至是一种完全不同的方法来获得我的数据框中的最小 no_calls 值(我确信有比循环更好的东西,我将不胜感激。
另外,如果有一种方法可以在 StackOverflow 上以表格形式呈现数据框,以便更容易直接使用它们,请告诉我。
【问题讨论】: