大熊猫以关联的字符串值将列添加到新数据框中吗?

时间:2019-11-15 00:34:19

标签: python pandas

我正在尝试从一个数据框向另一数据框添加一列,

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%准确,它可以与上面尝试的方法完全不同)

EDIT (谢谢),谢谢所有到目前为止我还没有解决问题的人。这是更多数据,

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

如果有帮助,则数据帧的长度不相同。任何其他想法或解决上述问题的方法将不胜感激。

3 个答案:

答案 0 :(得分:2)

为此,您需要合并这些数据框。一种方法是:

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

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

答案 1 :(得分:1)

您可以使用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”(因此映射更可能重叠),然后检查是否相等。

如果 still 对您不起作用,可能很不幸,您可能需要在街道名称之间提供更准确的地图数据集!街道名称很可能太不同而无法轻松地与字符串比较匹配。

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

答案 2 :(得分:0)

好的,我设法弄清楚了,但是如果您在使用相同数据的情况并非完全相同,则该解决方案可能不会太有帮助。 Bernardo Alencar的答案本质上是正确的,除了执行合并时无法对字符串应用操作(我仍然不确定是否有办法)。我发现了另一个数据集,其街道名称的格式与第一个相似。然后,我将第一个与第三个新数据框合并。在那之后,我有第一列和第二列都带有列["STREET_ID"]。然后我终于设法通过使用合并第二个和合并的一个,

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

从而获得所需的带有关联街道ID的最终数据帧