[英]Pandas Dataframe Check if column value is in column list
我有一個數據框df
:
data = {'id':[12,112],
'idlist':[[1,5,7,12,112],[5,7,12,111,113]]
}
df=pd.DataFrame.from_dict(data)
看起來像這樣:
id idlist
0 12 [1, 5, 7, 12, 112]
1 112 [5, 7, 12, 111, 113]
我需要檢查id
是否在idlist
,然后選擇或標記它。 我嘗試了以下變體並收到評論錯誤:
df=df.loc[df.id.isin(df.idlist),:] #TypeError: unhashable type: 'list'
df['flag']=df.where(df.idlist.isin(df.idlist),1,0) #TypeError: unhashable type: 'list'
解決方案的一些可能的其他方法將.apply
應用於列表理解?
我在這里尋找一個解決方案,要么選擇id
在idlist
的行,要么用 1 標記行,其中id
在idlist
。 結果df
應該是:
id idlist
0 12 [1, 5, 7, 12, 112]
要么:
flag id idlist
0 1 12 [1, 5, 7, 12, 112]
1 0 112 [5, 7, 12, 111, 113]
謝謝您的幫助!
使用apply
:
df['flag'] = df.apply(lambda x: int(x['id'] in x['idlist']), axis=1)
print (df)
id idlist flag
0 12 [1, 5, 7, 12, 112] 1
1 112 [5, 7, 12, 111, 113] 0
相似的:
df['flag'] = df.apply(lambda x: x['id'] in x['idlist'], axis=1).astype(int)
print (df)
id idlist flag
0 12 [1, 5, 7, 12, 112] 1
1 112 [5, 7, 12, 111, 113] 0
使用list comprehension
:
df['flag'] = [int(x[0] in x[1]) for x in df[['id', 'idlist']].values.tolist()]
print (df)
id idlist flag
0 12 [1, 5, 7, 12, 112] 1
1 112 [5, 7, 12, 111, 113] 0
過濾解決方案:
df = df[df.apply(lambda x: x['id'] in x['idlist'], axis=1)]
print (df)
id idlist
0 12 [1, 5, 7, 12, 112]
df = df[[x[0] in x[1] for x in df[['id', 'idlist']].values.tolist()]]
print (df)
id idlist
0 12 [1, 5, 7, 12, 112]
您可以使用df.apply
並處理每一行並創建一個新的列標志,該標志將檢查條件並在請求的第二個輸出時為您提供結果。
df['flag'] = df.loc[:, ('id', 'idlist')].apply(lambda x: 1 if x[0] in x[1] else 0, axis=1)
print(df)
其中x[0] is id
, x[1] is idlist
嘗試簡單的for
循環:
flaglist = []
for i in range(len(df)):
if df.id[i] in df.idlist[i]:
flaglist.append(1)
else:
flaglist.append(0)
df["flag"] = flaglist
df:
id idlist flag
0 12 [1, 5, 7, 12, 112] 1
1 112 [5, 7, 12, 111, 113] 0
刪除行:
flaglist = []
for i in range(len(df)):
if df.id[i] not in df.idlist[i]:
flaglist.append(i)
df = df.drop(flaglist)
df:
id idlist flag
0 12 [1, 5, 7, 12, 112] 1
以上可以轉換為列表推導式以創建標志列:
df["flag"] = [df.id[i] in df.idlist[i] for i in range(len(df))]
print(df)
# id idlist flag
# 0 12 [1, 5, 7, 12, 112] True
# 1 112 [5, 7, 12, 111, 113] False
或者
df["flag"] = [1 if df.id[i] in df.idlist[i] else 0 for i in range(len(df))]
print(df)
# id idlist flag
# 0 12 [1, 5, 7, 12, 112] 1
# 1 112 [5, 7, 12, 111, 113] 0
並選擇行:
flaglist = [i for i in range(len(df)) if df.id[i] in df.idlist[i]]
print(df.iloc[flaglist])
# id idlist
# 0 12 [1, 5, 7, 12, 112]
通過使用issubset
df.apply(lambda x : set([x.id]).issubset(x.idlist),1).astype(int)
Out[378]:
0 1
1 0
dtype: int32
通過使用np.vectorize
def myfun(x,y):
return np.in1d(x,y)
np.vectorize(myfun)(df.id,df.idlist).astype(int)
時間:
%timeit np.vectorize(myfun)(df.id,df.idlist).astype(int)
10000 loops, best of 3: 92.3 µs per loop
%timeit df.apply(lambda x : set([x.id]).issubset(x.idlist),1).astype(int)
1000 loops, best of 3: 353 µs per loop
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.