python - 根据条件在多个数据帧的数据帧内的列之间交换行

标签 python pandas numpy if-statement

我有一个如下所示的数据框,

foo = pd.DataFrame(
        [['chr1',2,1,'+',0.1,'NA','TSS1'],
        ['chr2',3,4,'-',0.03,'NA','TSS2'],
        ['chr3',7,6,'+',0.7,'NA','TSS3']], 
        columns = ('CHR', 'start', 'end','Strand','Peak','Ratio','Annotation')
    )
foo
    CHR start   end Strand  Peak    Ratio   Annotation
0   chr1    2   1   +   0.10    NA  TSS1
1   chr2    3   4   -   0.03    NA  TSS2
2   chr3    7   6   +   0.70    NA  TSS3

我的目标是在列开始和结束之间交换,即如果列开始大于列结束,那么我需要它交换其位置并保持其余列完整或保持原样。

类似这样的事情,

def fun(x):
   if df['start']> df['End']
print df[['CHR','end','start','Strand','Peak','Ratio','Annotation']]
   else
  return df

上面的功能没有按照我的需要工作。 最后,我需要一个数据框,

    CHR   start  end    Strand  Peak    Ratio   Annotation
0   chr1    1   2   +   0.10    NA  TSS1
1   chr2    3   4   -   0.03    NA  TSS2
2   chr3    6   7   +   0.70    NA  TSS3

任何帮助或更好的建议都会很棒。另外,我有大量的多个数据框。

最佳答案

我认为更简单的是:

foo[['start','end']] = foo[['start','end']].apply(np.sort, axis=1)
print (foo)
    CHR  start  end Strand  Peak Ratio Annotation
0  chr1      1    2      +  0.10    NA       TSS1
1  chr2      3    4      -  0.03    NA       TSS2
2  chr3      6    7      +  0.70    NA       TSS3

使用 minmax 的另一个解决方案:

df1 = foo[['start','end']]
foo['start'] = df1.min(axis=1)
foo['end'] =   df1.max(axis=1)
print (foo)
    CHR  start  end Strand  Peak Ratio Annotation
0  chr1      1    2      +  0.10    NA       TSS1
1  chr2      3    4      -  0.03    NA       TSS2
2  chr3      6    7      +  0.70    NA       TSS3

具有条件和 numpy.where 的解决方案,但需要numpy.column_stack对于每列重复 mask:

b = foo['start'] < foo['end']
foo[['start','end']] = np.where(np.column_stack([b,b]),
                                foo[['start','end']],
                                foo[['end','start']])
print (foo)
    CHR  start  end Strand  Peak Ratio Annotation
0  chr1      1    2      +  0.10    NA       TSS1
1  chr2      3    4      -  0.03    NA       TSS2
2  chr3      6    7      +  0.70    NA       TSS3

如果需要自定义函数apply不是必需的:

def fun(foo):
    b = foo['start'] < foo['end']
    foo[['start','end']] = np.where(np.column_stack([b,b]), 
                                    foo[['start','end']], 
                                    foo[['end','start']])
    return foo

print (fun(foo))
    CHR  start  end Strand  Peak Ratio Annotation
0  chr1      1    2      +  0.10    NA       TSS1
1  chr2      3    4      -  0.03    NA       TSS2
2  chr3      6    7      +  0.70    NA       TSS3

关于python - 根据条件在多个数据帧的数据帧内的列之间交换行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43762811/

相关文章:

python - 循环 Pandas 对象列表表现出奇怪的行为

python-3.x - 具有多个函数的 Pandas groupby agg 会返回错误

python - 用 pandas 计算列的 "energy"

python - 用户警告 : Failed to initialize NumPy: module compiled against API version 0xf but this version of numpy is 0xe (Triggered internally at

python - 在扫雷器的网格中放置 1's around "b"

python - 如何对 pandas DataFrame 中的内部列表进行排序?

python - Matplotlib 数据框图上缺少 X 轴标签

python - 超过 2 维的 numpy 点

python - 用numpy计算距离矩阵

python - 高效 append 到 Pandas 数据帧