Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 删除选定值后选择最大值_Python_Pandas_Dataframe - Fatal编程技术网

Python 删除选定值后选择最大值

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列中的相应值来计算的,然后找到其余三个

我有一个大的数据集(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
列中的相应值来计算的,然后找到其余三个值的最大值。因此,对于第一行,
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方法来解决程序。谢谢你指出。喜欢这种广播方式:)