Python 基于条件在dataframe内的列之间交换多个dataframe的行

Python 基于条件在dataframe内的列之间交换多个dataframe的行,python,pandas,numpy,if-statement,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') ) fo

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

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
另一种具有
min
max
的解决方案:

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
具有条件和,但需要为每列重复
掩码
的解决方案:

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

不,交换应该基于一个条件,而不仅仅是改变列的位置。如果列“end”小于列“start”,则交换这些行,否则保持原样。另外,上面的命令不适用于更大的dataframesAlso是否可以将其作为一个函数,我可以将其用于df.apply(func)Hmmm,我认为这是可能的,但不是那么容易。但给我一些时间。实际上没有问题,它为列ENDHMM抛出键错误,可能是一些空白?选中打印(df.columns.tolist())
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