【问题标题】:Pandas DataFrame filtering || Keeping only consecutive elements of a columnPandas DataFrame 过滤 ||只保留列的连续元素
【发布时间】:2020-03-22 23:49:04
【问题描述】:

我有以下数据帧

import pandas as pd


df = pd.DataFrame({'a': [201, 201, 201, 201, 202, 202, 202, 203, 203, 203],
                   'b': [  1,   2,   3,   5,   1,   2,   6,   1,   3,   4]})

df_filter = pd.DataFrame({'a': [      201,    202, 203],
                          'b': [[1, 2, 3], [1, 2], [1]]}).set_index('a')

它们看起来像:

>>> df
     a  b
0  201  1
1  201  2
2  201  3
3  201  5
4  202  1
5  202  2
6  202  6
7  203  1
8  203  3
9  203  4
>>>
>>> df_filter
             b
a             
201  [1, 2, 3]
202     [1, 2]
203        [1]

我想使用 df_filter 过滤 df。即,我想为'a'的每个元素保留'b'中对应列表的元素。

想要的结果:

>>> df_filtered
     a  b
0  201  1
1  201  2
2  201  3
4  202  1
5  202  2
7  203  1

另外,我实际上只想为“a”上的每个元素保留“b”的连续元素。我现在可以生成 'df_filter' 并使用它进行过滤,但任何更容易做到这一点的建议都非常受欢迎。

【问题讨论】:

  • 尽量不要对数据框使用名称过滤器,这是python中的特殊名称和DataFrame方法
  • 感谢您的评论。当然,这些不是实际的数据帧;我保持简单。但是,是的,你是对的。我编辑了它。

标签: python pandas dataframe filtering data-science


【解决方案1】:

pandas 0.25+ 的解决方案 - 通过Series.explode 将列表转换为行,然后默认为内连接merge(列名称相同,因此省略on 参数):

df = df_filter['b'].explode().reset_index().merge(df)
print (df)
     a  b
0  201  1
1  201  2
2  201  3
3  202  1
4  202  2
5  203  1

或者DataFrame.explode如果输入是2列DataFrame:

df_filter = pd.DataFrame({'a': [      201,    202, 203],
                       'b': [[1, 2, 3], [1, 2], [1]]})

df = df_filter.explode('b').merge(df)
print (df)
     a  b
0  201  1
1  201  2
2  201  3
3  202  1
4  202  2
5  203  1

编辑:为避免重置为默认索引值,请使用 reset_indexset_index

df = df_filter.explode('b').merge(df.reset_index()).set_index('index')
print (df)
         a  b
index        
0      201  1
1      201  2
2      201  3
4      202  1
5      202  2
7      203  1

【讨论】:

  • 感谢您的回答。几乎!请注意,我想保留原始 df 的索引。
  • 再次感谢。太棒了。关于如何只保留“b”的连续元素而不使用 df_filter 进行中间步骤的任何想法?
  • @ThanasisMattas - 是的,我需要一些时间
  • @ThanasisMattas - 你认为第一组连续值吗? df = df[df.groupby('a')['b'].diff().fillna(0).replace(1, 0).groupby(df['a']).cumsum().eq(0)] ?可以查一下吗?
  • 我可以理解,但它绝对不能补充可读性(想象一下也输入真实姓名)。无论如何,这对我有用。非常感谢!
猜你喜欢
  • 2016-02-22
  • 2015-12-13
  • 2018-03-20
  • 2022-07-28
  • 2021-12-16
  • 1970-01-01
  • 1970-01-01
  • 2017-05-10
  • 2013-03-17
相关资源
最近更新 更多