python - 熊猫过滤器,其中当前行字符串包含来自不同列中上一行的字符串
问题描述
我有以下熊猫数据框:
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)]
我会很感激任何帮助!
解决方案
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
推荐阅读
- javascript - this.state.xxx.map 不是函数
- json - 如何将所有数据加载到选取器视图中
- firebase - 获取当前的 Firestore API 调用
- vb.net - vb.net 从文本框日期获取一年的第一天/上个月的最后一天/上个月的第一天
- flutter - Flutter:在屏幕之间传递多个数据
- amazon-web-services - AWS 网络输出
- jupyterhub - 为自己读/写 Jupyter notebook,为他人只读
- python - 处理无效的 Json
- android - 实现“com.github.parse-community.Parse-SDK-Android:parse:1.20.0”不起作用
- embedded - 如何使普通的 C 库在嵌入式环境中工作?