【发布时间】:2017-10-08 19:58:34
【问题描述】:
我对 pandas 还很陌生,希望获得一些关于如何以最佳方式解决问题的反馈。我正在尝试从两个长度不等的数据框中评估两列的值以找到两种情况:
- data_set_2 中的 id1 在 data_set_1 中不存在。
- data_set_2 中的(id1, id2) 组合在data_set_1 中不存在。
复杂之处在于我想避免使用应用或循环方法。这些数据集可能会变得非常大(下面的示例是有意简化的),我的理解是可以有更多有条不紊的方法来处理这个问题。
data_set_1 = pd.DataFrame({"id1": ["A", "B", "C", "D"], "id2": ["1", "2", "2", "1"]})
data_set_2 = pd.DataFrame({"id1": ["A", "B", "F", "C", "D", "E"], "id2": ["1", "1", "2", "1", "1", "2"],"id3": ["1","2","3","4","5","6"]})
我期望返回的内容:
1. E, F
2.
(B, 1)
(F, 2)
(C, 1)
(E, 2)
到目前为止我尝试过的如下:
获取data_set_1中不存在的产品:
data_set_2.loc[~(data_set_2.id1.isin(data_set_1.id1))]
(这是我不确定这是否是最好的方法的地方)- 获取 data_set_1 中不存在的 id1、id2 组合:
我尝试了一个 isin 语句,似乎两个数据帧的长度似乎是一个问题,因为 pandas 将评估两个数据帧之间的相同索引行,并且它独立地评估每一列。
我发现我可以像这样索引多个列值:
data_set_2.set_index(["id1", "id2"], inplace=True,drop=False)
data_set_1.set_index(["id1", "id2"], inplace=True,drop=False)
让我这样做:
~data_set_2[["id1","id2"]].isin(data_set_1)
A 1 False False
B 1 True True
F 2 True True
C 1 True True
D 1 False False
E 2 True True
虽然这给了我想要的东西,但我无法在 loc 选择操作中选择评估为 True 的行:
data_set_2.loc[~data_set_2[["id1","id2"]].isin(data_set_1)]
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/usr/local/bfm/lib/python/pandas/0.20.2-cp35/pandas/core/indexing.py", line 1328, in __getitem__
return self._getitem_axis(key, axis=0)
File "/usr/local/bfm/lib/python/pandas/0.20.2-cp35/pandas/core/indexing.py", line 1539, in _getitem_axis
raise ValueError('Cannot index with multidimensional key')
ValueError: Cannot index with multidimensional key
让我觉得这不是解决问题的正确方法。关于如何最好地实现这一点的任何想法?
【问题讨论】:
标签: python python-3.x pandas