在熊猫的np.array上应用蒙版

时间:2018-04-20 20:41:13

标签: python pandas numpy

我有一个pd.DataFrame包含一个掩码和np.array。我想在数组上应用掩码(就像我对np.where所做的那样)

有没有人知道如何成功?

df = pd.DataFrame({'Mask'   : [[True, False, True], [False, False], [True, True]],
                   'Array'  : [[2, 5,4]           , [1, 0]        , [4, 5],],
                   'Result' : [[2, 4]             , []            , [4,5]]})

def ffilter(entry):
    return entry['Array']['Mask']

df.apply(ffilter) #--> Nope too easy :-(

2 个答案:

答案 0 :(得分:2)

您可以使用df.Mask创建一个掩码,将其传递给数据框的mask()函数并进行聚合。

这将是" 单行":

pd.DataFrame(df.Array.tolist())\
    .mask(np.asarray(df.Mask.tolist()))\
    .agg(['mean', 'std', 'min', 'max'])

给你:

        0         1
mean  1.0  2.500000
std   NaN  3.535534
min   1.0  0.000000
max   1.0  5.000000

或者作为一个整体:

import pandas as pd
import numpy as np

df = pd.DataFrame({'Mask'   : [[True, False], [False, False], [True, True]],
                   'Array'  : [[2, 5]       , [1, 0]        , [4, 5],],
                   'Result' : [[2]          , []            , [4, 5]]})

df_Array = pd.DataFrame(df.Array.tolist())
mask = np.asarray(df.Mask.tolist())

df_Array.mask(mask).agg(['mean', 'std', 'min', 'max'])

从评论中,仍然不清楚您想要的输出是什么。我假设你想要为数据框中的每个数组计算min,max,std等统计数据 - 还有 - 有一个数据框,其中每一行代表其中一个数组:

import pandas as pd
import numpy as np

df = pd.DataFrame({'Mask'   : [[True, False, True], [False, False], [True, True]],
                   'Array'  : [[2, 5,4]           , [1, 0]        , [4, 5],],
                   'Result' : [[2, 4]             , []            , [4,5]]})

df_stats = df.apply(lambda x: pd.Series(x.Array)[x.Mask]
                    .agg(['min', 'max', 'std', 'mean']), 1)

print(df_stats)

产生:

   min  max       std  mean
0  2.0  4.0  1.414214   3.0
1  NaN  NaN       NaN   NaN
2  4.0  5.0  0.707107   4.5

答案 1 :(得分:0)

即使它不是真正的pythonic,也可以做到这一点。

arr = df.Array.tolist()
mask = df.Mask.tolist()

result = [[np.asarray(a)[m]] for a, m in zip(arr, (mask))]
result

>>>[[array([2, 4])], [array([], dtype=int64)], [array([4, 5])]]