繁体   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