基本上,我要做的是将Table_A连接到Table_B,使用键在Table_B中执行查找以获取Table_A中存在的名称的列记录。
可以将Table_B视为存储有关名称的各种属性的主名称表。 Table_A表示包含名称信息的传入数据。
有两列代表名称 - 名为“ raw_name ”的列和名为“ real_name ”的列。 “ raw_name ”在 real_name 之前包含字符串“code_”。
即
raw_name = CE993_VincentHanna
real_name = VincentHanna
Key = real_name,存在于Table_A和Table_B
中请参阅mySQL表并在此查询:http://sqlfiddle.com/#!9/65e13/1
对于表_A中表示不存在的所有 real_names ,我想将 raw_name / real_name 对存储到对象中,以便我可以向数据输入人员发送警报以进行手动插入。
对于Table_B中的所有 real_names ,表B中存在,这意味着我们知道此名称,并且可以添加与此 real_name相关联的新 raw_name 进入我们的主Table_B
在mySQL中,这很容易,就像我在sqlfidde示例中看到的那样。我加入了real_name,我通过groupby a.real_name 压缩/折叠结果,因为我不关心Table_B中是否存在同一个real_name的多个记录。
我想要的只是提取属性(stats1,stats2,stats3),以便我可以将它们分配给新发现的raw_name。
在mySQL查询结果中,我可以将要发送的NULL记录分开以进行手动数据输入,并自动将其余记录插入Table_B。
现在,我正在尝试在Pandas中做同样的事情但是我坚持在实名的groupby点。
e = {'raw_name': pd.Series(['AW103_Waingro', 'CE993_VincentHanna', 'EES43_NeilMcCauley', 'SME16_ChrisShiherlis',
'MEC14_MichaelCheritto', 'OTP23_RogerVanZant', 'MDU232_AlanMarciano']),
'real_name': pd.Series(['Waingro', 'VincentHanna', 'NeilMcCauley', 'ChrisShiherlis', 'MichaelCheritto',
'RogerVanZant', 'AlanMarciano'])}
f = {'raw_name': pd.Series(['SME893_VincentHanna', 'TVA405_VincentHanna', 'MET783_NeilMcCauley',
'CE321_NeilMcCauley', 'CIN453_NeilMcCauley', 'NIPS16_ChrisShiherlis',
'ALTW12_MichaelCheritto', 'NSP42_MichaelCheritto', 'CONS23_RogerVanZant',
'WAUE34_RogerVanZant']),
'real_name': pd.Series(['VincentHanna', 'VincentHanna', 'NeilMcCauley', 'NeilMcCauley', 'NeilMcCauley',
'ChrisShiherlis', 'MichaelCheritto', 'MichaelCheritto', 'RogerVanZant',
'RogerVanZant']),
'stats1': pd.Series(['meh1', 'meh1', 'yo1', 'yo1', 'yo1', 'hello1', 'bye1', 'bye1', 'namaste1',
'namaste1']),
'stats2': pd.Series(['meh2', 'meh2', 'yo2', 'yo2', 'yo2', 'hello2', 'bye2', 'bye2', 'namaste2',
'namaste2']),
'stats3': pd.Series(['meh3', 'meh3', 'yo3', 'yo3', 'yo3', 'hello3', 'bye3', 'bye3', 'namaste3',
'namaste3'])}
df_e = pd.DataFrame(e)
df_f = pd.DataFrame(f)
df_new = pd.merge(df_e, df_f, how='left', on='real_name', suffixes=['_left', '_right'])
df_new_grouped = df_new.groupby(df_new['raw_name_left'])
现在我如何压缩/折叠实名上的df_new_grouped中的组,就像我在mySQL中一样。
一旦我有一个具有折叠结果的对象,我可以将数据帧切片为报告real_names,我们没有(NULL值)记录和我们已经知道的并且可以存储新发现的raw_name的记录。
答案 0 :(得分:2)
您可以根据列raw_name_left
删除重复项,也可以使用raw_name_right
删除drop
列
In [99]: df_new.drop_duplicates('raw_name_left').drop('raw_name_right', 1)
Out[99]:
raw_name_left real_name stats1 stats2 stats3
0 AW103_Waingro Waingro NaN NaN NaN
1 CE993_VincentHanna VincentHanna meh1 meh2 meh3
3 EES43_NeilMcCauley NeilMcCauley yo1 yo2 yo3
6 SME16_ChrisShiherlis ChrisShiherlis hello1 hello2 hello3
7 MEC14_MichaelCheritto MichaelCheritto bye1 bye2 bye3
9 OTP23_RogerVanZant RogerVanZant namaste1 namaste2 namaste3
11 MDU232_AlanMarciano AlanMarciano NaN NaN NaN
答案 1 :(得分:0)
为了彻底,这也可以使用Groupby完成,我在Wes McKinney的博客上找到了虽然drop_duplicates更干净,更有效率。
http://wesmckinney.com/blog/filtering-out-duplicate-dataframe-rows/
>index = [gp_keys[0] for gp_keys in df_new_grouped.groups.values()]
>unique_df = df_new.reindex(index)
>unique_df