我有以下熊猫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
值的行。如果col1
或col2
为NaN
,则不应考虑该行。因此,在此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)]
我将不胜感激!
答案 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