我有以下数据框
# 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'并使用它进行过滤,但是任何建议都可以更轻松地做到这一点,这将是不受欢迎的。
答案 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_index
和set_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