通过列值进行Python子设置

时间:2018-09-05 17:02:59

标签: python

这应该是一个相当简单的任务,但是我在任何地方都找不到。我有两个数据集,我想将第一个数据集作为子集,以便仅在第二个数据集中包含记录。每个表都有一个共同的帐户标识符列。

我尝试使用:

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  

希望该示例有助于阐明我在做什么。

1 个答案:

答案 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值是唯一的)。