我有兩個看起來像這樣的熊貓資料框
| ID | 電子郵件 | 姓名 |
|---|---|---|
| 1 | “[email protected]” | “名字姓氏” |
| ... | ... | ... |
| 5150 | “[email protected]” | “名字姓氏” |
大約有 5150 行。從某種意義上說,資料沒有被清理,因為name列中可能包含名稱有拼寫錯誤、額外的空格,以駝峰命名。也可能是名稱是空字串。
第二個資料幀包含這樣的資訊
| ID | 電子郵件 | 姓名 | 到 | 命名 |
|---|---|---|---|---|
| 1 | “[email protected]” | “名字姓氏” | “[email protected]” | “名字姓氏” |
| ... | ... | ... | ||
| 8500 | “[email protected]” | “名字姓氏” | “[email protected]” | “名字姓氏” |
大約有 8500 行。在這里,name列與第一個資料幀具有相同的問題。
我現在想在關系資料庫的意義上從前兩個資料幀中創建一個新的資料幀,即在表單中
| ID | 從 | 到 |
|---|---|---|
| 1 | 1 | 2 |
| 2 | 4 | 8 |
其中ID列是指ID第二個資料幀的列,From和To列中的值是指我們將名稱映射到整數的第一個資料幀。
下面的代碼運行但大約需要一分鐘。你們有什么想法我可以加快速度嗎?
Id_new = []
From_new = []
To_new = []
for i in range(0,len(second_df['Id'])):
Id_new.append(second_df['Id'].iloc[i])
email = second_df['Email'].iloc[i]
name = second_df['Name'].iloc[i]
testdf = first_Df.where(first_Df['Email'] == email).dropna()
value = int(testdf.loc[testdf['Name'] == name].iloc[0].at["ID"])
From_new.append(value)
emailto = second_df['To'].iloc[i]
nameto = second_df['To_Name'].iloc[i]
testdf = first_Df.where(first_Df['Email'] == emailto).dropna()
valueto = int(testdf.loc[testdf['Name'] == nameto].iloc[0].at["ID"])
To_new.append(valueto)
return output_df = pd.DataFrame(list(zip(Id_new, From_new, To_new)),
columns = ['ID', 'From', 'To'])
uj5u.com熱心網友回復:
在處理 Pandas DataFrames 時,您應該盡量避免運行 for 回圈,大多數情況下有更好的方法。在這種情況下,您可能想使用merge 合并、連接、連接和比較
你可以先在合并email和name,然后to和to_name,是這樣的:
df1 = pd.DataFrame(
{"ID": ["1", "2", "3"], "email": ["a", "b", "c"], "name": ["x", "y", "z"]}
)
df2 = pd.DataFrame(
{
"Id": ["1", "2", "3", "4"],
"email": ["a", "b", "c", "d"],
"name": ["x", "y", "z", "k"],
"to": ["m", "a", "b", "p"],
"to_name": ["r", "x", "y", "u"],
}
)
new_df = (
df2.merge(df1[["ID", "email", "name"]], on=["email", "name"], how="left")
.rename(columns={"ID": "From"})
.merge(df1, right_on=["email", "name"], left_on=["to", "to_name"], how="left")
.rename(columns={"ID": "To"})[["Id", "From", "To"]]
)
uj5u.com熱心網友回復:
我的方法是迭代第一個串列,將名稱和 ID 提取到字典中。然后,迭代第二個串列,同時提取名稱和 id 并豐富前一個 dict 以創建結果表。
result = {}
for index, row in first_df.iterrows():
result[row["Name"]] = {"From": row["Id"]}
for index, row in second_df.iterrows():
if row["Name"] in result:
result[row["Name"]]["To"] = row["Id"]
else:
result[row["Name"]] = {"To": row["Id"]}
這樣,您只需在每個資料幀上迭代一次。
uj5u.com熱心網友回復:
您可以簡單地使用替換:
import pandas as pd
df1 = pd.DataFrame([ { "ID": 1, "email": "[email protected]", "name": "firstname lastname" }, { "ID": 2, "email": "[email protected]", "name": "firstname lastname" } ])
df2 = pd.DataFrame([ { "Id": 1, "Email": "[email protected]", "Name": "firstname lastname", "To": "[email protected]", "To_Name": "firstname lastname" }, { "Id": 2, "Email": "[email protected]", "Name": "firstname lastname", "To": "[email protected]", "To_Name": "firstname lastname" } ])
df2[['Email', 'To']] = df2[['Email', 'To']].replace(df1.set_index('email')['ID'])
final_df = df2[['Id', 'Email', 'To']]
輸出:
| ID | 電子郵件 | 到 | |
|---|---|---|---|
| 0 | 1 | 2 | 1 |
| 1 | 2 | 1 | 2 |
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/360896.html
