如何在Pandas中筛选countryCode包含于对应myprice列的行?
筛选Pandas DataFrame中countryCode包含在对应行myprice列的记录
嘿,我来帮你解决这个Pandas筛选的问题!先回顾下你的场景:
原始数据
你有这样一个DataFrame:
| countryCode | Name | number | myprice | prices |
|---|---|---|---|---|
| DZ | name1 | number1 | US.p | nan |
| DZ | name1 | number1 | AU.currency | 45 |
| DZ | name1 | number1 | DZ.currency | 55 |
| DZ | name1 | number1 | DZ.p | 62 |
| DZ | name1 | number1 | AU.p | 73 |
| DZ | name1 | number1 | US.currency | nan |
| AU | name1 | number1 | US.p | nan |
| AU | name1 | number1 | AU.currency | 77 |
需求
你希望仅保留countryCode的字符串出现在对应行myprice字段中的记录,最终得到的结果如下:
| countryCode | Name | number | myprice | prices |
|---|---|---|---|---|
| DZ | name1 | number1 | DZ.currency | 55.0 |
| DZ | name1 | number1 | DZ.p | 62.0 |
| AU | name1 | number1 | AU.currency | 77.0 |
为什么你的尝试没成功?
你之前写的两行代码都没达到预期,原因是:
df[df.countryCode.isin(df.myprice)]:isin()是检查countryCode是否存在于整个myprice列的集合中,不是逐行匹配对应的值;df[df.myprice.str.contains(df.countryCode.str)]:str.contains()默认接收固定的字符串/正则表达式,直接传入Series的话无法实现逐行的对应匹配。
正确的解决方案
这里有两种简单有效的方法可以实现你的需求:
方法一:使用apply逐行判断
这是最直观的方式,通过apply遍历每一行,检查当前行的countryCode是否包含在myprice中:
import pandas as pd # 读取你的数据(你已经用read_clipboard获取了df) df = pd.read_clipboard() # 执行逐行筛选 filtered_df = df[df.apply(lambda row: row['countryCode'] in row['myprice'], axis=1)] # 查看结果 print(filtered_df)
方法二:使用向量化函数(更高效)
如果你的数据集很大,apply的效率可能不够理想,这时候可以用numpy.vectorize实现向量化的逐行匹配:
import pandas as pd import numpy as np df = pd.read_clipboard() # 定义判断函数 def check_country_in_myprice(myprice_str, country_code): return country_code in myprice_str # 向量化函数 vectorized_check = np.vectorize(check_country_in_myprice) # 筛选数据 filtered_df = df[vectorized_check(df['myprice'], df['countryCode'])] # 查看结果 print(filtered_df)
这两种方法都能精准得到你想要的结果,运行后输出的DataFrame就和你期望的完全一致啦!
内容的提问来源于stack exchange,提问作者BhishanPoudel
相关产品推荐
相关产品推荐

