我有一个如下所示的数据框,
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
具有条件和 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/