我正在寻找在我之前使用遮罩过滤的数据帧上计算模式的方法。为了解释这个问题,下面是一个数据外观示例:
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
如您所见,我在每一行上骑自行车,在使用大熊猫时,尤其是当行数很多时(这是我的情况),强烈建议不要这样做。我正在寻找一种更优化的方法来获得结果。
有什么主意吗?
答案 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