我有一个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 :-(
答案 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])]]