熊猫DataFrame过滤||仅保留列的连续元素

时间:2019-11-27 12:08:31

标签: python pandas dataframe filtering data-science

我有以下数据框

# or what ever password you kept while enabling xpack

它们看起来像:

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_filter过滤df。即,我想为“ a”的每个元素保留“ b”中相应列表的元素。

想要的结果:

>>> 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]

此外,我实际上只想对'a'上的每个元素仅保留'b'的连续元素。现在,我可以生成'df_filter'并使用它进行过滤,但是任何建议都可以更轻松地做到这一点,这将是不受欢迎的。

1 个答案:

答案 0 :(得分:3)

熊猫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

如果输入是2列DataFrame,则为DataFrame.explode

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