我有一個任意長度串列的Pandas系列:
我有一個任意長度串列的Pandas系列。
s = pd. Series([[1,2,3], [4, 6], [7,8,9,10]])
和一個元素的串列
l = [1, 2, 3,6,7,8]
我想回傳系列s中的所有元素,其中包含l中的所有值,否則None。我想做這樣的事情,但要應用于系列中的每個元素:
s.where(s.isin(l), None)
因此,輸出將是一個系列:
pd. Series([[1,2,3], None, None] )
uj5u.com熱心網友回復:
你可以使用python的魔力sets:
s.apply(set(l) .issuperset)
輸出:
0 True
1 False
2 False
d型別。bool
然后使用where來修改不匹配的行,使用前面的輸出作為掩碼:
s.where(s.apply(set(l).issuperset), None)
輸出:
0 [1, 2, 3]
1 None ]
2 None
d型別。object
uj5u.com熱心網友回復:
你可以explode系列,使用isin與l和使用all的引數level=0(相當于索引上的groupby.all)。
print(s.explode().isin(l).all(level=0)
0 真
1 False False
2 False
d型別。bool
在where中使用這個布爾掩碼,可以得到預期的結果
s1 = s.where(s.explode().isin(l).all(level=0), None)
print(s1)
0 [1, 2, 3]
1 None ]
2 None
d型別。object
由于@mozway的評論,all中的引數level=0已經被廢棄了,所以解決方案是使用groupby.all
s1 = s.where(s.explode().isin(l).groupby(level=0).all(), None)
uj5u.com熱心網友回復:
@TomNash,你可以將all函式與listcomprehension相結合:
s = pd. Series([[1,2,3], [4, 5,6], [7,8,9]]
l = [1,2,3, 6,7, 8]
final_list = []
for x in s:
if all( item in l for item in x) 。
final_list.append(x)
else:
final_list.append(None)
print(final_list)
OUTPUT:
[[1, 2, 3], None, None]
uj5u.com熱心網友回復:
s = pd. Series([[1,2,3], [4, 6], [7,8,9,10]])
l = [1,2,3,6,7,8]
new_series = []
for i in range(len(s))。
s_in_l = 0 0
for j in range(len(s[i]>)):
if s[i][j] not in l。
s_in_l = s_in_l 1
if s_in_l == 0:
new_series.append(s[i])
else:
new_series.append(None)
new_series = pd.Series(new_series)
print(new_series)
輸出:
0 [1, 2, 3]
1 None ]
2 None
d型別。object
uj5u.com熱心網友回復:
你可以通過.issubset函式來檢查s的元素是l的子集,如下所示:
s.apply(lambda x: x if set(x) 。 issubset(l) else None)
或者利用numpy函式setdiff1d,如下:
s. apply(lambda x: x if (len(np.setdiff1d(x, l) == 0) else None)
結果:
0 [1, 2, 3]
1 None ]
2 None
d型別。object
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/307668.html
標籤:
