【问题标题】:Subset-selection using Pandas "isin"-syntax使用 Pandas “isin”-syntax 进行子集选择
【发布时间】:2015-10-28 13:29:26
【问题描述】:

我有一个关于表(表 A - 包含三个键的多个值和一些“值”列)的问题,具体如下:

ID TIME1 TIME2 VALUE_A VALUE_B 1 201501 201501 a 1a 1 201502 201502 1c 1 201502 201502 b 1d 1 201501 201501 b 2e 1 201501 201501 b 6a 1 201501 201501 b 1d 1 201502 201502 b 2e 1 201502 201502 b 6a

我使用了从另一个表创建唯一值的代码,在给定键的情况下,获取我想从表 A 中提取的行的引用。该表(表B)的外观如下:

ID 时间1 时间2 1 201502 201502 2 201511 201511

我已经设法通过简单的合并来取出我想要的值,它给出了我想要从表 A 中得到的值,给定的引用。但是,我也想使用“isin”功能来实现这一点。根据下面的语法,我有我的语法,它给了我重复的值。我唯一想要的是从表 B 中取出表 A 中的行,参考表 B。我怎样才能做到这一点?

表C如下:

ID TIME1 TIME2 VALUE_A VALUE_B 1 201502 201502 1c 1 201502 201502 b 1d 1 201502 201502 b 2e 1 201502 201502 b 6a

语法(“isin”-version):

subset = df[df.ID.isin(df2['ID']) & (df.TIME1.isin(df2['TIME1']) & df.TIME2.isin(df2['TIME2']))]

创建表A和表B的代码如下:

df = DataFrame({'ID' : [1,1,1,1,1,1,1,1], 'TIME1' : [201501,201502,201502,201501,201501,201501,201502,201502], 'TIME2' : [201501,201502,201502,201501,201501,201501,201502,201502], 'VALUE_A' : ['a', 'a', 'b', 'b', 'b', 'b', 'b', 'b'], 'VALUE_B' : ['1a', '1c', '1d', '2e', '6a', '1d', '2e', '6a']}) df2 = DataFrame({'ID' : [1,2], 'TIME1':[201502,201501], 'TIME2':[201502,201501] })

提前非常感谢!

【问题讨论】:

  • 对不起,我不清楚你的问题,你能发布想要的结果吗,据我所知,你的 isin 版本给出的结果与df.merge(df2)
  • 我已经发布了“table c”作为我想从使用“isin”功能中得到的一个例子!

标签: python pandas subset


【解决方案1】:

我相信您想将布尔条件修改为:

In [146]:
subset = df[df.ID.isin(df2['ID']) & (df.TIME1.isin(df2['TIME1']) | df.TIME2.isin(df2['TIME2'])) ]
subset

Out[146]:
   ID   TIME1   TIME2 VALUE_A VALUE_B
1   1  201502  201-02       a      1c
2   1  201502  201502       b      1d
6   2  201511  201511       b      2e
7   2  201511  201511       b      6a

因此,这会检查 ID 是否存在以及 Time1 或 Time2 是否在另一个 df 中。

【讨论】:

  • 奇怪的是,当我将这个逻辑应用于我正在处理的更大的表时,我得到所有布尔值的“真”,尽管我有不同的“时间”列和相同身份证号?你知道是否存在布尔表达式没有对所有三个包含的列进行评估的情况,所以它只查看第一列(“id”)
  • 您必须最好使用示例数据、代码和预期输出来定义您想要的内容。目前我正在使用您的代码和所需的输出,我认为您需要充分解释真/假条件是什么
  • 我稍微改变了输入表的开销。使用相同的逻辑,抱歉不清楚,我想取出表 C,即所有满足在参考表 b 中的条件的行。
  • 您没有说明条件,请将其编辑到您的问题中
  • 我已经编辑了我试图使用的“isin”函数,但它在 id = 1 及其附属时间戳上产生了多行。我只希望从表 A 中选择表 B 中的第一行,生成表 C。我希望清楚地说明我想要什么。很抱歉不清楚!
【解决方案2】:

您只需使用isin() by

即可实现此目的
In [102]:
df[df.TIME1.isin(df2.TIME1) & df.TIME2.isin(df2.TIME2)]

Out[102]:
ID  TIME1   TIME2   VALUE_A VALUE_B
1   201502  201502     a    1c
1   201502  201502     b    1d
2   201511  201511     b    2e
2   201511  201511     b    6a

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-18
    • 1970-01-01
    • 2020-09-05
    • 2011-01-29
    • 1970-01-01
    • 2017-08-10
    相关资源
    最近更新 更多