在pandas中合并两个没有列名的数据框(对pandas不熟悉的人)

4

简要说明:

如果您的数据中有重复的列名,请在读取文件时将一个列重命名。

如果您的数据中有NaN等值,请将其删除。

然后使用下面正确的答案进行合并。


可能是一个非常简单的问题。

我有两个数据集,使用pandas.read_csv()读取。

我的数据在两个分离的csv文件中。

使用以下代码:

        import mibian
        import pandas as pd


        underlying = pd.read_csv("txt1.csv", names=['dt1','price']);

        options = pd.read_csv("txt2.txt", names=['dt2','ticker','maturity','strike','cP','px','strike','yield','rF','T','rlzd10']);

        merged = underlying.merge(options, left_on='dt1', right_on='dt2');

我的两个数据头长这样:
>>> underlying.head();

          0         1
0  20040326  3.579987
1  20040329  3.690494
2  20040330  3.755247
3  20040331  3.719373
4  20040401  3.728671

并且

>>> options.head();

         0     1         2     3     4      5     6   7      8         9                10

0  20130628  SVXY  20130817  32.5  call  39.22  32.5   0  0.005  0.136986   0.411224

所以我要合并的数据集上的列0是我想要合并的关键字,我希望保留来自两个结果集的所有数据。

我应该如何做?我在网上找到的所有示例都需要关键字,但我的结果中没有。

但是在连接上,我收到以下错误:

                            Traceback (most recent call last):
                              File "<stdin>", line 1, in <module>
                              File "/Applications/Spyder.app/Contents/Resources/lib/python2.7/spyderlib/widgets/externalshell/sitecustomize.py", line 540, in runfile
                                execfile(filename, namespace)
                              File "/Users/jasonmellone/.spyder2/.temp.py", line 12, in <module>
                                merged = underlying.merge(options, left_on='dt1', right_on='dt2',how='outer');
                              File "/Library/Python/2.7/site-packages/pandas-0.13.0-py2.7-macosx-10.9-intel.egg/pandas/core/frame.py", line 3723, in merge
                                suffixes=suffixes, copy=copy)
                              File "/Library/Python/2.7/site-packages/pandas-0.13.0-py2.7-macosx-10.9-intel.egg/pandas/tools/merge.py", line 40, in merge
                                return op.get_result()
                              File "/Library/Python/2.7/site-packages/pandas-0.13.0-py2.7-macosx-10.9-intel.egg/pandas/tools/merge.py", line 197, in get_result
                                result_data = join_op.get_result()
                              File "/Library/Python/2.7/site-packages/pandas-0.13.0-py2.7-macosx-10.9-intel.egg/pandas/tools/merge.py", line 722, in get_result
                                return BlockManager(result_blocks, self.result_axes)
                              File "/Library/Python/2.7/site-packages/pandas-0.13.0-py2.7-macosx-10.9-intel.egg/pandas/core/internals.py", line 1954, in __init__
                                self._set_ref_locs(do_refs=True)
                              File "/Library/Python/2.7/site-packages/pandas-0.13.0-py2.7-macosx-10.9-intel.egg/pandas/core/internals.py", line 2091, in _set_ref_locs
                                'have _ref_locs set' % (block, labels))
                            AssertionError: Cannot create BlockManager._ref_locs because block [IntBlock: [dt1], 1 x 372145, dtype: int64] with duplicate items [Index([u'dt1', u'price', u'dt2', u'ticker', u'maturity', u'strike', u'cP', u'px', u'strike', u'yield', u'rF', u'T', u'rlzd10'], dtype='object')] does not have _ref_locs set

我搜索了我的数据集,没有重复的内容。

谢谢!


如果问题仍然存在,您能否发布数据链接,以便我可以下载并查看? - EdChum
@EdChum drop_duplicates 会导致与 merge 相同的错误 AssertionError: Cannot create BlockManager._ref_locs because block [IntBlock: - jason m
我看了一下你的数据,svxySynthetic.csv 文件中 dt1 有独特的值,但是 optionsArg 中的 dt2 存在重复值,因为你有一个 call 条目和一个 put 条目。实际上,在 372032 行数据中,你只有 2411 个唯一的 dt2 值,所以你希望如何合并这些值? - EdChum
如果我将基础资产与期权合并会怎样?我实际上想要重复的日期行,并且只想要期权每个日期的基础价格,而不是基础资产每天的期权价格。这样说清楚了吗? - jason m
如果您交换顺序并指定左连接,那么它应该可以工作:merged=options.merge(underlying, left_on'dt2', right_on'dt1', how='left') - EdChum
显示剩余5条评论
3个回答

3

您仍然可以在列上合并:

merged = underlying.merge(options, left_on='0', right_on='0')

这将执行内部合并,因此仅在两个数据集的交集中,即列0中的值存在于两个数据集中时,如果您想要所有值,则指定outer

merged = underlying.merge(options, left_on='0', right_on='0', how='outer')

In [10]:  

merged = underlying.merge(options, left_on='0', right_on='0', how='outer')

merged

Out[10]:

          0       1_x   1_y         2     3     4      5     6   7      8  \
0  20040326  3.579987   NaN       NaN   NaN   NaN    NaN   NaN NaN    NaN   
1  20040329  3.690494   NaN       NaN   NaN   NaN    NaN   NaN NaN    NaN   
2  20040330  3.755247   NaN       NaN   NaN   NaN    NaN   NaN NaN    NaN   
3  20040331  3.719373   NaN       NaN   NaN   NaN    NaN   NaN NaN    NaN   
4  20040401  3.728671   NaN       NaN   NaN   NaN    NaN   NaN NaN    NaN   
5  20130628       NaN  SVXY  20130817  32.5  call  39.22  32.5   0  0.005   

          9        10  
0       NaN       NaN  
1       NaN       NaN  
2       NaN       NaN  
3       NaN       NaN  
4       NaN       NaN  
5  0.136986  0.411224  

[6 rows x 12 columns]

如果有冲突的列是1_x1_y,则需要重新命名或移动这些列。

最好在读取csv文件之前将列重命名为一些有意义的名称。在读取csv时,您可以传递一个列名列表:

df = pd.read_csv('data.csv', names=['Id', 'Price'])

2

类似的问题也让我来到了这个主题。我遇到了一个键错误。解决方法是将left_on='0'中的单引号删除,改为left_on=0

merged = underlying.merge(options, left_on='0', right_on='0')
merged = underlying.merge(options, left_on=0, right_on=0)

-1

如果您想要使用相同的列进行合并,这在您的情况下是正确的,您可以简单地使用on=0,其中0表示两个数据框中的第一列。

import pandas as pd
merged = underlying.merge(options, on=0, how='outer')
# or
merged = pd.merge(underlying, options, on=0, how='outer')

如果两个数据框的索引列不同,则可以使用left_onright_on选项。
# here 0 is the index column for df1 and 2 is the index column for df2
pd.merge(df1, df2, left_on=0, right_on=2, how='outer')

实际上,当您有大量没有标题的csv /数据文件时,这并不正确。此外,当您在多个文件上应用相同的命令且它们的列名不同时,它也非常有效。 - Abu Shoeb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接