首页 > 解决方案 > 熊猫过滤器,其中当前行字符串包含来自不同列中上一行的字符串

问题描述

我有以下熊猫数据框:

df = pd.DataFrame({'col1':['1', np.nan, '2', np.nan, np.nan, '3', '4', '7', np.nan], 'col2':[np.nan, '1,2', np.nan, '0,3', '0,3', np.nan, np.nan, np.nan, '7,8']})

看起来像这样:

  col1 col2
0    1  NaN
1  NaN  1,2
2    2  NaN
3  NaN  0,3
4  NaN  0,3
5    3  NaN
6    4  NaN
7    7  NaN
8  NaN  7,8

我试图弄清楚如何创建一个矢量化过滤器,该过滤器将返回其col2值包含col1前一行值的行。如果是col1或,col2NaN不应考虑该行。因此,在这个 df 上,结果应该是:

1  NaN  1,2
8  NaN  7,8

起初我考虑col1向下移动一个并使用类似的东西isin

 df[(df['col1'].shift(1).fillna('').isin(something in here)]

但后来我意识到它isin不会单独处理每一行,即它检查每一行是否在同一个列表中。所以现在我确信我应该使用一些类似的东西,df['col2'].str.contains(df['col2'])但我不太确定如何处理转变以及什么不是。

同样,目标是拥有一个矢量化过滤器,这样我就可以做到这一点:

filtered_rows = df[(filter_here)]

我会很感激任何帮助!

标签: pythonpandas

解决方案


df = pd.DataFrame({'col1':['1', np.nan, '2', np.nan, np.nan, '3', '4', '7', np.nan], 'col2':[np.nan, '1,2', np.nan, '0,3', '0,3', np.nan, np.nan, np.nan, '7,8']})
df['col1_shifted'] = df['col1'].shift(1)
mask = df.apply(
    lambda x: x.col1_shifted in str(x.col2).split(',')
    if x.col1_shifted
    else False, axis=1
)
filtered_rows = df[mask][['col1', 'col2']]

filtered_rows

  col1 col2
1  NaN  1,2
8  NaN  7,8

推荐阅读