熊猫过滤器,其中当前行字符串包含不同列中前一行的字符串

时间:2020-02-14 16:53:47

标签: python pandas

我有以下熊猫DataFrame:

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值的行。如果col1col2NaN,则不应考虑该行。因此,在此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)]

我将不胜感激!

1 个答案:

答案 0 :(得分:0)

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
相关问题