我有這個資料。
df1 = pd.DataFrame({"user": [1942, 95870, 85228, 6636],
"0": [1524, 8788, 9899, 27172],
"1": [1333, 4476, 78783, 90832],
"2": [2021, 2022, 34522, 38479]})
df1.set_index(df1['user'])
print(df1)
user 0 1 2
0 1942 1524 1333 2021
1 95870 8788 4476 2022
2 85228 9899 78783 34522
3 6636 27172 90832 38479
df1并且df2具有相同的行數(實際資料有 100 萬)并且每一行df2由方括號中的幾個數字組成,用逗號分隔,如下所示:
df2 = pd.DataFrame({
"0": [[1123, 2021, 8788]]})
方括號中的數字不同,從1到20,在這種情況下,這只是然而,對于該行數df2和df1是相同的。
print(df2)
0
0 [1123, 2021, 8788]
我想要做的是選擇來自用戶df1,例如user1942和比較,如果任何行中的三個數字(1524, 1333, 2021)在任何相應的方括號DF2的[1123, 2021, 8788]。布林值為 1,否則為 True,否則為 0,或任何其他表示形式都會有所幫助。
更新:比較應逐行進行。這是 in 中df1的一行,而df2.
輸出可能如下所示,或者更接近:輸出:由于 2021 年在 df2 中,因此答案為 True。然后移動到 df1 中的下一個用戶,將該用戶的 3 個數字與 df2 中的相應行號進行比較,等等。
user status
1942 1
...
我知道有很多關于比較多列的問題,但我找不到與此背景關系可重現或類似的內容。
uj5u.com熱心網友回復:
假設 df1 的索引與 df2 的索引相同,并且兩者的行之間的關系是 1:1,我會做這樣的事情:
df3 = pd.DataFrame()
for index, row in df1.iterrows():
to_find = [row[1], row[2], row[3]]
to_check = df2.iloc[index][0]
if [True for i in to_find if i in to_check]:
df3 = df3.append([1])
else:
df3 = df3.append([0])
您為 df1 中的值創建一個串列,然后檢查是否有任何值出現在相應 df2 行的串列中,如果至少有一個值匹配,則將 1 附加到結果 df3,否則為 0。始終假設您的關系為 1 :1,現在在 df3 中,您擁有與所選用戶對應的索引和用于驗證匹配的布林值。
編輯:改進 Daniele 的解決方案以允許對整數進行迭代
df3 = pd.DataFrame()
for index, row in df1.iterrows():
to_find = [row[0], row[1], row[2], row[3]]
to_check = df2.iloc[index][0]
to_numpy = np.array([to_check])
to_list = to_numpy.tolist()
if [True for i in to_find if i in to_list]:
df3 = df3.append([1])
else:
df3 = df3.append([0])
uj5u.com熱心網友回復:
我還沒有找到一個不依賴 for 回圈的非常優雅的解決方案,但是如果我們首先將資料幀轉換為 np.arrays(甚至串列),我們可以獲得一個非常體面的解決方法。首先,我們操縱df1以獲得有組織的記錄
import pandas as pd
import numpy as np
df1 = pd.DataFrame({"user": [1123, 95870, 85228, 6636],
"0": [1524, 8788, 9899, 27172],
"1": [1333, 4476, 78783, 90832],
"2": [2021, 2022, 34522, 38479]})
df1 = df1.set_index('user', drop=True)
print(df1)
0 1 2
user
1123 1524 1333 2021
95870 8788 4476 2022
85228 9899 78783 34522
6636 27172 90832 38479
然后,我們對df2. 即使兩個資料框的列數不同,所提出的方法也能作業。
df2 = pd.DataFrame([[1123, 2021, 8788, 6636],
[1333, 2023, 4477, 78783],
[1524, 2023, 9899, 27172],
[2021, 2023, 345233,38479]]
)
df2 = pd.DataFrame(df2.to_numpy().tolist())
df2 = df2.set_axis(df1.index, axis=0)
print(df2)
0 1 2 3
user
1123 1123 1333 8788 6636
95870 1333 2023 4477 78783
85228 1524 2023 9899 27172
6636 2021 2023 345233 38479
最后,我們使用串列推導式生成所需的值,該推導式遍歷行以檢查它們是否具有共同的元素。
inter = [np.isin(arr[0], arr[1]).any() for arr in zip(df1.to_numpy(), df2.to_numpy())]
print(inter)
[True, False, True, True]
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/374268.html
