这应该是一个相当简单的任务,但是我在任何地方都找不到。我有两个数据集,我想将第一个数据集作为子集,以便仅在第二个数据集中包含记录。每个表都有一个共同的帐户标识符列。
我尝试使用:
ma2 = ma[ma.LID.isin(df.LID)]
其中:
ma
是我的主要数据帧大小=(133788,8),
df
是我的第二张桌子尺寸=(2367,4),
LID
是我的列名,带有唯一的帐户标识符。
我的目标是获得数据框ma =(2367,8)
这导致ma2的大小为(0,8)。不是我想要的(除非第二个表的值不在第一个表中,我知道它们是)
我也尝试过:
ma2 = ma[(ma['LID'].isin(df['LID']))]
这导致相反的ma2大小=(0,8)
感谢您的帮助。如果需要,我可以尝试创建一个可复制的示例,但我认为不需要。
这是我要研究并尝试完成的简短示例:
表马:
LID colB colC colD
1 a ab x
2 b ab y
3 a ac y
4 b ac x
表df:
LID colC colE
1 ab w
2 ab w
4 ac w
ma的新子集:
LID colB colC colD
1 a ab x
2 b ab y
4 b ac x
希望该示例有助于阐明我在做什么。
答案 0 :(得分:0)
您需要这个:
ma.loc[ ma.LID.isin( df.LID ) ]
请注意原始表达式(添加的.loc
)之间的区别。
表达式ma.loc[ list-like-object ]
通过布尔向量(必须与ma
相同的长度)选择行。具有“ true”的行将被返回。
(另一方面,在类似df[ something ]
的表达式中,“某物”通常是一列或一列列表,而不是您想要的)。
请注意,虽然ma.loc[ ma.LID.isin( df.LID ) ]
应该可以工作,但是对于大量数据来说效率不是很高。您可能想重新索引数据框(或其副本)以使LID中的值作为索引,然后可以直接使用ma_indexed_by_LOC.loc[ df.LOC ]
选择它们。 (这是假定LOC值是唯一的)。