Python 删除选定值后选择最大值
我有一个大的数据集(3亿行),我需要一个高效(或快速)的算法来完成这项工作。下面是几行数据集Python 删除选定值后选择最大值,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个大的数据集(3亿行),我需要一个高效(或快速)的算法来完成这项工作。下面是几行数据集 db = pd.DataFrame({'A': [2,3,4,5], 'T': [1,2,6,7], 'G': [8, 1, 4, 6], 'C': [1,1 , 3, 4], 'basecall' : ['G', 'A', 'G', 'T']}) 我需要一个新的列(max\u-eliminate),它是通过消除basecall列中的相应值来计算的,然后找到其余三个
db = pd.DataFrame({'A': [2,3,4,5], 'T': [1,2,6,7], 'G': [8, 1, 4, 6],
'C': [1,1 , 3, 4], 'basecall' : ['G', 'A', 'G', 'T']})
我需要一个新的列(max\u-eliminate
),它是通过消除basecall
列中的相应值来计算的,然后找到其余三个值的最大值。因此,对于第一行,basecall
是“G”,在去掉相应的值后,它是8,剩下的三个值是2,1,1。max\u include
列将选择这些值的最大值,该行为2
db_new = pd.DataFrame({'A': [2,3,4,5], 'T': [1,2,6,7], 'G': [8, 1, 4, 6],
'C': [1,1 , 3, 4], 'basecall' : ['G', 'A', 'G', 'T'],
'max_eliminate' : [2, 2, 6, 6]})
我将一次按100万行读取此数据集用于根据db['basecall']
中的列查找值,然后用于选择除basecall
之外的列,并用于屏蔽查找值,即s
,最后沿axis=1
:
s = db.lookup(db.index, db['basecall'])
db['max_eliminate'] = db.filter(regex='^(?!basecall)')\
.mask(lambda x: x.eq(s, axis=0)).max(1)
结果:
A T G C basecall max_eliminate
0 2 1 8 1 G 2.0
1 3 2 1 1 A 2.0
2 4 6 4 3 G 6.0
3 5 7 6 4 T 6.0
stack
然后过滤掉'basecall'
与原始列标题相同的行。然后在原始索引上使用max
进行agg
s = db.set_index('basecall', append=True).stack()
db['max_eliminate'] = (s[s.index.get_level_values('basecall') != s.index.get_level_values(-1)]
.groupby(level=0).max())
A T G C basecall max_eliminate
0 2 1 8 1 G 2
1 3 2 1 1 A 2
2 4 6 4 3 G 6
3 5 7 6 4 T 6
另一种
numpy
方法是使用广播为数据帧列(而不是'basecall'
)创建掩码,然后沿行max
忽略NaN
m = db.columns[:-1].to_numpy() == db['basecall'].to_numpy()[:, None]
#[[False False True False]
# [ True False False False]
# [False False True False]
# [False True False False]]
db['max_eliminate'] = db.drop(columns='basecall').mask(m).max(1)
当另一列的值与
basecall
相同时会发生什么情况?例如:如果第一行的列A
为8
,则输出应返回什么?@anky在消除8后,输出应为8,因为8对应于G。其余三行的最大值为8,如果需要重复的值,则可以与A@ @ KelvFutt对应,那么可以使用@ ALOLZ <代码> NUMPY < /COD>的答案。在我想了更多之后,我需要使用@ ALOLZ NUMPY方法来解决程序。谢谢你指出。喜欢这种广播方式:)