![](/img/trans.png)
[英]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.