是否在关联的字符串值处向新数据帧添加列?

2024-06-17 12:17:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试将一列从一个数据帧添加到另一个数据帧

df.head()

enter image description here

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

enter image description here

PRE_DIR只是街道名称的前缀。我想做的是将相关街道的列STREET_ID添加到df。我试过几种方法,但我对熊猫和琴弦的比较缺乏经验

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"]

enter image description here

我按照建议尝试过这种方法,但仍然存在一些索引问题

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"]

这会抛出这个错误

enter image description here

如果有帮助的话,数据帧的长度就不一样了。任何更多的想法或方法来解决上述将不胜感激。你知道吗


Tags: 数据方法nameidstreetdfgetdir
3条回答

好吧,我设法弄明白了,但是如果你不是在完全相同的情况下使用相同的数据,解决方案可能不会有太大帮助。Bernardo Alencar的回答是基本正确的,只是在合并时我无法对字符串应用操作(我仍然不确定是否有方法可以做到这一点)。我发现另一个数据集的街道名称格式与第一个相似。然后,我将第一个数据帧与第三个新数据帧合并。在这之后,第一个和第二个都有["STREET_ID"]列。最后我用

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

从而得到所需的最终数据帧和相关的街道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.html

此外,您尝试合并的列上的字符串必须完全匹配(包括大小写)。你知道吗

您可以使用map函数执行以下操作:

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

其中get_street_id定义为一个函数,给定df["STREET"]中的值。将返回一个要插入新列的值:

(免责声明;目前未经测试)

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

我们得到一个street_map2的数据帧,它通过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”(因此映射更可能重叠),然后检查是否相等。你知道吗

如果这仍然不适合您,您可能需要在街道名称之间建立一个更精确的映射数据集!很可能街道名称太不相同,很难与字符串比较匹配。你知道吗

(如果你能提供一些街道名称的例子以及它们应该重叠的地方,我们也许能帮助你更好地发展“模糊”匹配!)

相关问题 更多 >