我使用Python 3.4,Pandas 0.16.2和Jupyter Notebook作为我的IDE。
我正在导入以下两个数据帧:
Lookup = pd.read_excel("LookupMergeOutput.xlsx")
Concatenated = pd.read_csv('Concatenated.csv', error_bad_lines = False, na_values='', iterator=True, chunksize=1000)
data = pd.concat([chunk for chunk in Concatenated], ignore_index=True)
数据
查找 数据帧规范:23353行8; 8列
Columns: Dtype:
LOGINNAME object
FIRSTNAME object
LASTNAME object
ID_y int64
CREATEUSERID int64
REVISIONUSERID int64
BEGINDATE object
ENDDATE object
数据 数据帧规范:23653行; 667列
此数据框中合并的感兴趣列是REFERENCE_ID
和
data.REFERENCE_ID.dtype
as'object'
要合并的列是ID_y
和REFERENCE_ID
(在 数据 数据框中)。 查找 中的列包含唯一值计数(例如,265926639等)。
数据 数据框具有唯一值,但也重复条目的实例(例如,265946567的三个实例。此外,还有以下错误字符串漫画:421D6158-22D4-EDAC-0DEA-33B1FB5CC7AF
。
目标:
要在关键列ID_y
和REFERENCE_ID
上合并 查找 和 数据 ,分别。
***参考文献和之前的搜索答案,但收效甚微:
到目前为止我的尝试:
merged_left = pd.merge(left=Lookup,right=data, how='left', left_on='ID_y', right_on='REFERENCE_ID')
这将返回所有 查找 数据,但 数据 数据框的所有667列都返回null值。
理论上,如果两个“关键”列中有共同数字,则来自 数据 数据框的数据要匹配。我的假设是存在数据类型冲突,或者因为 数据 数据帧中存在重复数字,因此未进行合并。我想避免删除 data 列中的重复项或多个键实例,因为这可能包含有效数据。
我还尝试将ID_y
列名重命名为REFERENCE_ID
并执行合并,如下所示:
Lookup=Lookup.rename(columns = {'ID_y':'REFERENCE_ID'})
这会生成null
数据框(只是列,但没有值)。我还尝试将索引设置为ID_y
和REFERENCE_ID
,然后对索引执行合并:
Lookup = Lookup.set_index('ID_y')
data = data.set_index('REFERENCE_ID')
merged_on_index = pd.merge(Lookup,data, left_index=True,right_index=True)
我收到以下追溯:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-35-3909fd759082> in <module>()
----> 1 pd.merge(AgentLookup,data,left_index=True,right_index=True)
C:\WinPython-64bit-3.4.3.5\python-3.4.3.amd64\lib\site-packages\pandas\tools\merge.py in merge(left, right, how, on, left_on, right_on, left_index, right_index, sort, suffixes, copy)
36 right_index=right_index, sort=sort, suffixes=suffixes,
37 copy=copy)
---> 38 return op.get_result()
39 if __debug__:
40 merge.__doc__ = _merge_doc % '\nleft : DataFrame'
C:\WinPython-64bit-3.4.3.5\python-3.4.3.amd64\lib\site-packages\pandas\tools\merge.py in get_result(self)
184
185 def get_result(self):
--> 186 join_index, left_indexer, right_indexer = self._get_join_info()
187
188 ldata, rdata = self.left._data, self.right._data
C:\WinPython-64bit-3.4.3.5\python-3.4.3.amd64\lib\site-packages\pandas\tools\merge.py in _get_join_info(self)
257 if self.left_index and self.right_index:
258 join_index, left_indexer, right_indexer = \
--> 259 left_ax.join(right_ax, how=self.how, return_indexers=True)
260 elif self.right_index and self.how == 'left':
261 join_index, left_indexer, right_indexer = \
C:\WinPython-64bit-3.4.3.5\python-3.4.3.amd64\lib\site-packages\pandas\core\index.py in join(self, other, how, level, return_indexers)
2041 other = other.astype('O')
2042 return this.join(other, how=how,
-> 2043 return_indexers=return_indexers)
2044
2045 _validate_join_method(how)
C:\WinPython-64bit-3.4.3.5\python-3.4.3.amd64\lib\site-packages\pandas\core\index.py in join(self, other, how, level, return_indexers)
2054 else:
2055 return self._join_non_unique(other, how=how,
-> 2056 return_indexers=return_indexers)
2057 elif self.is_monotonic and other.is_monotonic:
2058 try:
C:\WinPython-64bit-3.4.3.5\python-3.4.3.amd64\lib\site-packages\pandas\core\index.py in _join_non_unique(self, other, how, return_indexers)
2125
2126 left_idx, right_idx = _get_join_indexers([self.values], [other.values],
-> 2127 how=how, sort=True)
2128
2129 left_idx = com._ensure_platform_int(left_idx)
C:\WinPython-64bit-3.4.3.5\python-3.4.3.amd64\lib\site-packages\pandas\tools\merge.py in _get_join_indexers(left_keys, right_keys, sort, how)
459
460 # get left & right join labels and num. of levels at each location
--> 461 llab, rlab, shape = map(list, zip( * map(fkeys, left_keys, right_keys)))
462
463 # get flat i8 keys from label lists
TypeError: type object argument after * must be a sequence, not map
在这个时候,我不知道什么是最好的策略。我欢迎有关后续步骤的反馈。
答案 0 :(得分:2)
您的加入字段都是不同的数据类型。 REFERENCE_ID
作为对象类型,ID_y
作为数字int64
类型。有趣的是,pandas中的object
dtype是一个NumPy ndarray,它包含指向可变长度字符串项的指针。此外,当导入的数据包含字符串和数字时,object
是最常用的数据类型。
考虑使用astype将联接字段转换为相同的数据类型。当然,字符串往往是最宽松的,允许使用连字符等各种字符。
字符串转换:
data['REFERENCE_ID'] = data['REFERENCE_ID'].apply(str) # NOTICE APPLY HERE
LookUp['ID_y'] = LookUp['ID_y'].astype(str)
数字转换:
data['REFERENCE_ID'] = data['REFERENCE_ID'].astype(int)
组合:
data['REFERENCE_ID'] = data['REFERENCE_ID'].astype(str).astype(int)
LookUp['ID_y'] = LookUp['ID_y'].astype(str).astype(int)