Pandas数据帧过滤| |只保留列的连续元素

2024-04-19 00:11:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下数据帧

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,使用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”的连续元素。我现在可以生产'dfu过滤器'和过滤器与此,但任何建议,这样做更容易谁会比欢迎。你知道吗


Tags: 数据import元素过滤器dataframepandasdf列表
1条回答
网友
1楼 · 发布于 2024-04-19 00:11:06

pandas0.25+的解决方案-通过^{}将列表转换为行,然后通过默认的内部联接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

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

相关问题 更多 >