簡體   English   中英

Pandas 將列添加到關聯字符串值的新數據幀?

[英]Pandas add column to new data frame at associated string value?

我正在嘗試將一列從一個 dataframe 添加到另一個,

df.head()

在此處輸入圖像描述

street_map2[["PRE_DIR","ST_NAME","ST_TYPE","STREET_ID"]].head()

在此處輸入圖像描述

PRE_DIR只是街道名稱的前綴。 我想要做的是將相關街道的STREET_ID列添加到df 我嘗試了一些方法,但是我對 pandas 缺乏經驗,並且字符串的比較妨礙了我,

street_map2['STREET'] = df["STREET"]
street_map2['STREET'] = np.where(street_map2['STREET'] == street_map2["ST_NAME"])

上面的代碼顯示了“ValueError:值的長度與索引的長度不匹配”。 我也試過street_map2['STREET'].str in street_map2["ST_NAME"].str 誰能想到一個好的方法來做到這一點? (請注意,它不需要 100% 准確,只需獲得最多,它可能與上面嘗試的方法完全不同)

編輯感謝到目前為止所有嘗試過的人,我還沒有解決問題。 這里還有一些數據,

street_map2["ST_NAME"]

在此處輸入圖像描述

我已經按照建議嘗試了這種方法,但仍然存在一些索引問題,

def get_street_id(street_name):
     return street_map2[street_map2['ST_NAME'].isin(df["STREET"])].iloc[0].ST_NAME

df["STREET_ID"] = df["STREET"].map(get_street_id)
df["STREET_ID"]

這會引發此錯誤,

在此處輸入圖像描述

如果有幫助,數據幀的長度不同。 任何更多的想法或解決上述問題的方法將不勝感激。

為此,您需要合並這些數據框。 一種方法是:

df.merge(street_map2, left_on='STREET', right_on='ST_NAME')

這將做的是:它將在ST_NAMESTREET列中查找相等的值,並用來自兩個數據幀的其他列的值填充行。

查看此鏈接以獲取更多信息: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.merge.ZFC35FDC70D5FC69D269883A8227C

此外,您嘗試合並的列上的字符串必須完全匹配(包括大小寫)。

您可以使用map function 執行以下操作:

df["STREET_ID"] = df["STREET"].map(get_street_id)

其中get_street_id被定義為 function ,給定來自df["STREET"]的值。 將返回一個值以插入新列:

(免責聲明;目前未經測試)

def get_street_id(street_name):
    return street_map2[street_map2["ST_NAME"] == street_name].iloc[0].ST_NAME

我們得到 street_map2 的 dataframe 過濾,其中 st-name 列與 street-name 相同:

street_map2[street_map2["ST_NAME"] == street_name]

然后我們使用iloc[0]獲取它的第一個元素,並返回ST_NAME值。

然后,我們可以通過更新索引操作來添加您在問題中解決的容錯:

...
street_map2[street_map2["ST_NAME"].str.contains(street_name)]
...

也許,

...
street_map2[street_map2["ST_NAME"].str.startswith(street_name)]
...

或者,更靈活:

...
street_map2[
    street_map2["ST_NAME"].str.lower().replace("street", "st").startswith(street_name.lower().replace("street", "st"))
]
...

...這會將兩個值都小寫,例如將“street”轉換為“st”(因此映射更有可能重疊),然后檢查是否相等。

如果這仍然不適合您,您可能需要在街道名稱之間提供更准確的映射數據集。 街道名稱很可能太不同而無法輕松匹配字符串比較。

(如果您能夠提供一些街道名稱的示例以及它們應該在哪里重疊,我們也許可以幫助您更好地開發“模糊”匹配!)

好吧,我設法弄明白了,但如果你不是在完全相同的情況下使用相同的數據,該解決方案可能不會有太大幫助。 Bernardo Alencar 的回答基本正確,只是在進行合並時我無法對字符串應用操作(我仍然不確定是否有辦法做到這一點)。 我發現另一個數據集的街道名稱格式與第一個相似。 然后我將第一個與第三個新數據框合並。 在此之后,我有第一個和第二個列["STREET_ID"] 然后我終於設法通過使用將第二個與合並的一個合並,

temp = combined["STREET_ID"]
CrimesToMapDF = street_maps.merge(temp, left_on='STREET_ID', right_on='STREET_ID')

從而獲得具有相關街道 ID 的所需最終數據框

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM