使用xlsx将大pandas合并,并在输出中生成空值列

我使用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) 

数据

查找dataframe规格: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 

作为“对象”

要合并的列是ID_yREFERENCE_ID (在数据数据ID_y )。 Lookup中的列包含唯一的值计数(例如,265926639等)。

数据数据帧具有唯一的值,但也会重复一个条目的实例(例如,265946567的三个实例)。此外,还有以下漫画的错误string: 421D6158-22D4-EDAC-0DEA-33B1FB5CC7AF

目标 :分别在关键列ID_yREFERENCE_ID上合并查找数据

***参考和事先寻找答案,但没有什么成果:

  1. 左合并而不重新索引
  2. 条件合并
  3. Chris Albon的教程
  4. 合并多个数据框
  5. 数据木工的回顾

我到目前为止所尝试的:

 merged_left = pd.merge(left=Lookup,right=data, how='left', left_on='ID_y', right_on='REFERENCE_ID') 

这将返回所有Lookup数据,但数据数据帧的所有667列都将返回为空值。

从理论上讲,如果在两个“关键”列中有共同的数字,则要从数据数据框中将数据进行匹配。 我的假设是要么有数据types冲突,要么是因为数据数据帧中有重复的数字,合并没有发生。 我想避免在数据列中删除重复或多个键的实例,因为这可能有有效的数据。

我也尝试将ID_y列名重命名为REFERENCE_ID并执行合并,如下所示:

 Lookup=Lookup.rename(columns = {'ID_y':'REFERENCE_ID'}) 

这产生一个null数据框(只是列,但没有值)。 我也尝试将索引设置为ID_yREFERENCE_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 

在这个时候,我不知道什么是最好的策略。 我欢迎下一步的反馈意见。

连接字段都是不同的数据types。 REFERENCE_ID作为对象types, ID_y作为数字int64types。 有趣的是,pandas中的object dtype是一个NumPy ndarray ,它持有指向可变长度string项的指针。 而且,当导入的数据包含string和数字时, object是数据types中最通用的。

考虑使用astype将连接字段转换为相同的数据types。 当然,string往往是最宽容的,允许连字符等各种字符。

string转换:

 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)