大家好,我需要你的幫助。
我有兩列 A 和 B 的 df,它們都是帶有字串值的列
例子:
df_1 = pd.DataFrame(data={
"A":['a','b','c'],
"B":['a x d','z y w','q m c'] #string values not a list
})
print(df_1)
#output
A B
0 a a x d
1 b z y w
2 c q m c
現在我要做的是在 df_1 中執行 loc 以獲取 col B 在 col A 中包含字串值的所有行。
在這個例子中,我想要的輸出是第一行和第三行
A B
0 a a x d # 'a x d' contain value 'a'
2 c q m c # 'q m c' contain value 'c'
我嘗試了不同的 loc 條件,但得到了不可散列的型別:“系列”錯誤:
df_1.loc[df_1["B"].str.contains(df_1["A"])] #TypeError: unhashable type: 'Series'
df_1.loc[df_1["A"] in df_1["B"]] #TypeError: unhashable type: 'Series'
由于 df 的大小,我真的不想使用 for/while 回圈。
知道如何執行此操作嗎?謝謝
uj5u.com熱心網友回復:
可愛的!
from operator import contains
df_1.loc[map(contains, *map(df_1.get, ['B', 'A']))]
A B
0 a a x d
2 c q m c
并且沒有匯入但有一個丑陋的dunder ... /-:
df_1.loc[map(str.__contains__, *map(df_1.get, ['B', 'A']))]
另外,對于 OP ......不要接受這個答案。我只是在打高爾夫球。您永遠不應該在生產代碼中使用它,因為由于使用了 2 個地圖和一個 splat,它不太透明。
只是為了超級清楚......
mozway的比較好
uj5u.com熱心網友回復:
沒有矢量方法,in使用兩列進行映射。你需要在這里回圈:
mask = [a in b for a,b in zip(df_1['A'], df_1['B'])]
df_1.loc[mask]
輸出:
A B
0 a a x d
2 c q m c
速度比較(3000行)
# operator.contains
518 μs ± 4.61 μs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
# list comprehension
554 μs ± 3.84 μs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
# numpy.apply_along_axis
7.32 ms ± 58.8 μs per loop (mean ± std. dev. of 7 runs, 100 loops each)
# apply
20.7 ms ± 379 μs per loop (mean ± std. dev. of 7 runs, 10 loops each)
uj5u.com熱心網友回復:
你可以試試:
out = df_1.loc[df_1.apply(lambda x: x['A'] in x['B'], axis=1)]
print(out)
# Output
A B
0 a a x d
2 c q m c
替代numpy:
df_1.loc[np.apply_along_axis(lambda x: x[0] in x[1], axis=1, arr=df_1)]
uj5u.com熱心網友回復:
在 pandas 中訪問兩個不同的列時,您可以使用 .apply()
df.apply(lambda row: row['A'] in row['B'], axis = 1)
這將創建一個布爾系列,您可以將其用于您的 loc 條件,該條件僅選擇“A”在“B”中的列:
df.loc[df.apply(lambda row: row['A'] in row['B'], axis = 1)]
uj5u.com熱心網友回復:
df_1[df_1.apply(lambda x:x['A'] in x['B'],axis=1)]
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/446253.html
