如何在python中使用重复值洗牌选定列,而不指定与原始datafram相同的值

2024-09-29 23:15:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我想在我的数据帧中洗牌列“chr”,保持其余的值不变。我希望确保新值与原始数据帧中的值不同

>>> import pandas as pd
>>> import numpy as np
>>> abuniq = pd.read_csv("/home/m203319/nonenh/abuniq.csv")
>>> abuniq
     chr  enhmid strand  tss  dist
0   chr1      60    pos  791   731
1   chr1     993    pos  919    74
2   chr2      72    neg  388   316
3   chr2      92    neg  388   296
4   chr2     172    neg  388   216
5   chr2     484    neg  388    96
6   chr3     100    neg  231   131
7   chr3     362    neg  231   131
8   chr4     163    pos  310   147
9   chr4     464    pos  612   148
10  chr4     756    pos  774    18
11  chr5     290    neg  339    49
12  chr5     538    pos  487    51
13  chr5     730    pos  487   243
>>> #Create df with only chr and drop rest
...
>>> ab_drop = abuniq.drop(['enhmid','strand', 'tss', 'dist'], axis=1)
>>> ab_drop
     chr
0   chr1
1   chr1
2   chr2
3   chr2
4   chr2
5   chr2
6   chr3
7   chr3
8   chr4
9   chr4
10  chr4
11  chr5
12  chr5
13  chr5
>>> # Shuffle the chr column
...
>>> ab_shuffle1 = ab_drop.sample(frac=1, random_state=1)
>>> ab_shuffle1.reset_index(inplace=True, drop=True)
>>> ab_shuffle1
     chr
0   chr2
1   chr3
2   chr3
3   chr2
4   chr4
5   chr2
6   chr1
7   chr5
8   chr1
9   chr5
10  chr4
11  chr4
12  chr5
13  chr2
>>>

洗牌后,一些值没有改变,例如索引3、5和12。在没有分配相同值的情况下,洗牌的最佳方法是什么


Tags: posimportabasdroppdchr1chr
1条回答
网友
1楼 · 发布于 2024-09-29 23:15:15

这是快速的,肮脏的,正如巴尔马指出的那样,可能导致没有解决方案,但它在最简单的情况下工作,几乎没有负担

while True:
    new = np.random.permutation(abuniq[‘chr’])
    if abuniq[abuniq[‘chr’] == new].empty:
        break
abuniq[‘chr’] = new

相关问题 更多 >

    热门问题