[英]count number of a specific string in entire data frame in Pandas and add its value in a new column
[英]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_NAME
和STREET
列中查找相等的值,並用來自兩個數據幀的其他列的值填充行。
查看此鏈接以獲取更多信息: 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.