Python 在pandas中从字典到数组的映射不正确?

Python 在pandas中从字典到数组的映射不正确?,python,pandas,Python,Pandas,我打算合并两个数据框架,芝加哥犯罪和Redfin房地产数据,但Redfin数据是按芝加哥的邻居收集的,而犯罪数据是按社区区域收集的。为了做到这一点,我在芝加哥发现了一种方法,我知道如何将社区划分为社区区域。两个数据帧的结构有点不同,所以我对其进行了几步操作。以下是有关我尝试的详细信息: 示例数据片段 这是我可以查看的公共要点 这是我从网上收集的资料 我的解决方案 这是我的第一个映射解决方案: code_pairs_neighborhoods = [[p[0], p[1]] for p in [p

我打算合并两个数据框架,芝加哥犯罪和Redfin房地产数据,但Redfin数据是按芝加哥的邻居收集的,而犯罪数据是按社区区域收集的。为了做到这一点,我在芝加哥发现了一种方法,我知道如何将社区划分为社区区域。两个数据帧的结构有点不同,所以我对其进行了几步操作。以下是有关我尝试的详细信息:

示例数据片段

这是我可以查看的公共要点

这是我从网上收集的资料

我的解决方案

这是我的第一个映射解决方案:

code_pairs_neighborhoods = [[p[0], p[1]] for p in [pair.strip().split('\t') for pair in neighborhood_Map.strip().split('\n')]]
neighborhood_name_dic = {k[0]:k[1] for k in code_pairs_neighborhoods} #neighborhood -> community area

chicago_crime['neighborhood'] = chicago_crime['community_name'].map(neighborhood_name_dic)
Redfin['neighborhood'] = Redfin['Region'].map(neighborhood_name_dic)

final_df= pd.merge(chicago_crime, chicago_crime, on='neighborhood')
但是这个解决方案没有找到正确的映射,
邻域
变成了NAN,这是错误的

第二次映射尝试

在不使用邻域映射的情况下,我直观地提出了以下映射解决方案:

chicago_crime['community_name']=[[y.split() for y in x] for x in chicago_crime['community_name']]
Redfin['Region']= [[j.split() for j in i] for i in Redfin['Region']]

idx, datavalue = [], []
for i,dv in enumerate(chicago_crime['community_name']):
    for d in dv:
        if d in Redfin['Region'][i]:   
            if i not in idx:
                idx.append(i)
                datavalue.append(d)

chicago_crime['merge_ref'] = datavalue
Redfin['merge_ref'] = datavalue

final_df= pd.merge(chicago_crime[['community_area','community_name','merge_ref']], Redfin, on='merge_ref')
但是这个解决方案给了我一个错误:
ValueError:值的长度与索引的长度不匹配,
AttributeError:'list'对象没有属性“split”

我怎样才能做到这一点?基于,如何获得Redfin数据和芝加哥犯罪数据的正确映射?有没有办法使这个映射正确并得到正确的合并数据帧?有什么想法吗?提前谢谢

更新


我将包括数据集在内的所有解决方案都放在这个github存储库中

好的,下面是我的发现:

  • 您可能要删除的
    邻域地图的第一行中有一个unicode字符:
    Cabrini\xe2\x80\x93Green'
    ->
    Cabrini Green
  • 切换
    邻里\u name\u dic
    中的键和值,因为您希望将现有的“罗杰斯公园”映射到邻里的“东罗杰斯公园”,如下所示:

    neighborhood\u name\u dic={k[1]:k[0]表示代码对中的k\u neighborhood}

我们仍然无法从您的代码中了解您在中的阅读情况,但我认为您必须先删除
地区
列中的
芝加哥,IL-
部分,然后才能合并


更新:所以我想我已经理解了你的代码(同样,请在发布之前尝试清理一下这些东西),我认为
Redfin
等于
house_df
。因此,不是说:

house_df=house_df.set_index('Region',drop=False)
我建议创建一个邻里专栏:

house_df['neighborhood'] = house_df['Region'].map(lambda x: x.lstrip('Chicago, IL - '))
然后您可以在以下位置合并:

crime_finalDF = pd.merge(chicago_crime, house_df, left_on='neighborhood', right_on='neighborhood')
要测试它,请尝试:

mask=(crime_finalDF['neighborhood']==u'Sheridan Park')
print(crime_finalDF[['robbery','neighborhood', u'2018-06-01 00:00:00']][mask])
这将产生:

   robbery   neighborhood  2018-06-01 00:00:00
0    140.0  Sheridan Park                239.0
1    122.0  Sheridan Park                239.0
2    102.0  Sheridan Park                239.0
3    113.0  Sheridan Park                239.0
4    139.0  Sheridan Park                239.0
因此,两个数据集的成功连接(我认为)

更新2,关于
合并()的成功

这是我读入并清理您的
xlsx
文件的方式:

house\u df=pd.read\u excel(“./real\u eastate\u data\u main.xlsx”)
房屋建筑设计图替换({'-':无})
house_df.columns=house_df.columns.astype(str)
house_-df=house_-df[house_-df[“地区]!=“伊利诺伊州芝加哥”]
house_-df=house_-df[house_-df[“地区]!=“伊利诺伊州芝加哥市地铁区”]
house_-df['Neighbor']=house_-df['Region'].str.split('-')###注意周围的空间
house_df['Neighborary']=house_df['Neighborary'].地图(lambda x:list(x)[-1])
芝加哥犯罪['Neighborary']=芝加哥犯罪['community\u name'].地图(Neighborary\u name\u dic)
##湖景公园和洪堡公园未在社区名称中定义
#打印(chicago_crime['community_name','Neighbory']][pd.isnull(chicago_crime['Neighbory']))
芝加哥犯罪=芝加哥犯罪[~pd.isnull(芝加哥犯罪['neighborary'))]###删除它们
现在我们转向寻找两个df中所有独特的社区

cc=sorted(chicago_crime['Neighbour'].unique())
ho=已排序(house_df['Neighbour'].unique())
打印(30*u“-”+u“芝加哥犯罪:+30*u“-”)
打印(镜头(抄送),抄送)
打印(30*u“-”+u“house_df:+30*u“-”)
印刷品(len(ho),ho)
打印(60*“-”)
#打印('\n'.加入(cc))
set1=set(cc)
set2=set(ho)
缺失=列表(已排序(set1-set2))
添加=列表(已排序(set2-set1))
print('house_df:{1}中缺少这些{0}'。格式(len(缺少),缺少))
打印(60*“-”)
打印('这些{0}仅在{1}内部。'格式(len(added),added))
这表明29在house_df(如“东皮尔森”)中缺失,132只在house_df(如“奥尔巴尼公园”)中找到,即我们只能“内部连接”46个条目


现在,您必须决定如何继续,最好先了解合并的工作方式(例如,了解此处发布的维恩图),然后您可以相应地改进代码!或者:以前手动清理数据,有时没有完全自动的解决方案

好的,以下是我的发现:

  • 您可能要删除的
    邻域地图的第一行中有一个unicode字符:
    Cabrini\xe2\x80\x93Green'
    ->
    Cabrini Green
  • 切换
    邻里\u name\u dic
    中的键和值,因为您希望将现有的“罗杰斯公园”映射到邻里的“东罗杰斯公园”,如下所示:

    neighborhood\u name\u dic={k[1]:k[0]表示代码对中的k\u neighborhood}

我们仍然无法从您的代码中了解您在中的阅读情况,但我认为您必须先删除
地区
列中的
芝加哥,IL-
部分,然后才能合并


更新:所以我想我已经理解了你的代码(同样,请在发布之前尝试清理一下这些东西),我认为
Redfin
等于
house_df
。因此,不是说:

house_df=house_df.set_index('Region',drop=False)
我建议创建一个邻里专栏:

house_df['neighborhood'] = house_df['Region'].map(lambda x: x.lstrip('Chicago, IL - '))
然后您可以在以下位置合并:

crime_finalDF = pd.merge(chicago_crime, house_df, left_on='neighborhood', right_on='neighborhood')
要测试它,请尝试:

mask=(crime_finalDF['neighborhood']==u'Sheridan Park')
print(crime_finalDF[['robbery','neighborhood', u'2018-06-01 00:00:00']][mask])
这将产生:

   robbery   neighborhood  2018-06-01 00:00:00
0    140.0  Sheridan Park                239.0
1    122.0  Sheridan Park                239.0
2    102.0  Sheridan Park                239.0
3    113.0  Sheridan Park                239.0
4    139.0  Sheridan Park                239.0
因此,两个数据集的成功连接(我认为)

更新2,关于
合并()的成功

这就是我阅读的方式