熊猫:选择行 - 基于列表 - 带有重复行标签的 DF

Posted

技术标签:

【中文标题】熊猫:选择行 - 基于列表 - 带有重复行标签的 DF【英文标题】:pandas: select rows - based on list - DF with duplicate rows labels 【发布时间】:2016-02-20 03:37:50 【问题描述】:

类似但不一样:Selecting rows - based on a list - from a DF with duplicated columns

我有两个 dfs:

df1 = pd.DataFrame('total': [25, 45, 75, 36, 45], 
                   index=['base', 'c', 'd', 'base', 'e'])
      total
base     25
c        45
d        75
base     36
e        45

df2 = pd.DataFrame('type': ['rc', 'rc', 'c%', 'c%', 'pp%'], 
                    index=['base', 'c', 'd', 'base', 'e'])

     type
base   rc
c      rc
d      c%
base   c%
e      pp%

我想从 df1 获取 df2 中值为 'c%' 和/或 'pp%' 的行。

这就是我的做法

keep = df2[df2['type'].isin(['c%', 'pp%'])].index
Index([u'd', u'base', u'e'], dtype='object')

df1.loc[keep]
      total
d        75
base     25
base     36
e        45

'base 25' 不应该在那里,但因为我使用标签,所以我理解它为什么在那里。

期望的结果:

      total
d        75
base     36
e        45

如何更改我的代码来处理这个问题?

【问题讨论】:

【参考方案1】:
In [9]:

(df2['type'] == 'c%') | (df2['type'] == 'pp%')
Out[9]:
base    False
c       False
d        True
base     True
e        True
Name: type, dtype: bool

In [8]:
df1[(df2['type'] == 'c%') | (df2['type'] == 'pp%')]
Out[8]:
     total
d      75
base   36
e      45

【讨论】:

重置索引怎么样?因为过滤可能不是基于布尔值。 您要基于truefalse 值还是基于indices 进行切片? 索引。道歉真假只是一个例子,更容易解释。 你提到了I want to get the rows which are 'True' from df2 from df1,其实我听不懂你的问题 我已经更新了我的问题,希望它更清楚一点。使用真假不是一个好主意。【参考方案2】:

这是你想要的吗?

In [54]: df1[['total']][df2['bool']=='True']
Out[54]: 
      total
d        75
base     36
e        45

【讨论】:

以上是关于熊猫:选择行 - 基于列表 - 带有重复行标签的 DF的主要内容,如果未能解决你的问题,请参考以下文章

按给定列表的顺序选择重复的熊猫数据框行并保留原始索引

将熊猫数据框列列表值拆分为重复行[重复]

如何从熊猫系列中获取包含行索引的列表[重复]

我有一个带有列表的熊猫列。对包含来自同一列的至少一个公共元素的行进行分组

通过多个标签过滤或选择熊猫中两行之间的数据

在熊猫数据框中选择行[重复]