熊猫-应用遮罩时加快模式计算

时间:2019-06-26 22:00:11

标签: python pandas

我正在寻找在我之前使用遮罩过滤的数据帧上计算模式的方法。为了解释这个问题,下面是一个数据外观示例:

ID,MASK,VALUE
1,[2,3],4
2,[4,1],2
3,[],2
4,[2],3

我想要获得的结果如下:

ID,MASK,VALUE,VALUE_M
1,[2,3],4,2
2,[4,1],2,3
3,[],2,-1
4,[2],3,2

当无法确定模式时,我希望使用最小的数字。如果未定义MASK,则值为-1

我现在使用的代码如下:

for index,row in df.iterrows():
    mask= row['MASK']
    if len(mask)>0:
        df.loc[index,'VALUE_M'] = df.loc[df['ID'].isin(MASK),'VALUE'].value_counts().index[0]
    else: 
        df.loc[index,'VALUE_M'] = -1

如您所见,我在每一行上骑自行车,在使用大熊猫时,尤其是当行数很多时(这是我的情况),强烈建议不要这样做。我正在寻找一种更优化的方法来获得结果。

有什么主意吗?

2 个答案:

答案 0 :(得分:1)

unnesting首先使用原始df进行March 2019,然后我们可以使用names(dataset)[2]=as.Date(names(dataset)[2],format="%B %Y") 进行merge

crosstab

idxmax

答案 1 :(得分:0)

我正在假设您的MASK列存储为一系列str,因此我正在list函数内部转换为find_mode在使用isin()方法之前。不知道这是否比@WeNYoBen的答案要快,但是我认为它要简单得多:

def find_mode(row):

    mask = ast.literal_eval(row['MASK'])

    return df[df['ID'].isin(mask)]['VALUE'].mode().values[0] if mask else -1

df['VALUE_M'] = df.apply(find_mode, axis=1)

收益:

   ID   MASK  VALUE  VALUE_M
0   1  [2,3]      4        2
1   2  [4,1]      2        3
2   3     []      2       -1
3   4    [2]      3        2