我有一个名为df的数据框,看起来像-
pageno entity code rawentity
17727425 SAUDI CBCNTRY saudi
17727425 GARRA DRWRNAME garra
17727425 PO BOX RBCNTRY po box
17727425 NEW ZEALAND DRWRCNTRY new zealand
我还有一个包含国家/地区名称的国家/地区列表。类型为“列表”。
我正在尝试仅保留代码为- CBCNTRY 或 RBCNTRY 或 DRWRCNTRY 的值,并且该实体应位于国家/地区列表。
我写的代码是-
for row in df.itertuples():
if(row.code in ['DRWRCNTRY', 'RBCNTRY', 'CBCNTRY']):
if(row.entity not in countrylist):
df.drop((row.index), inplace=True)
但是我遇到了以下错误-
Error is: labels [<built-in method index of Pandas object at 0x0000020A1BCE4EB8>] not contained in axis
我只想知道为什么我的方法是错误的,除了这种方法,还有什么我可以做的更好的事情了。
我已经搜索了此错误,但无法获得满意的答案。
答案 0 :(得分:1)
处理系列时,可以使用pd.isin
。例如,您可以通过以下操作来实现:
df = df[df['code'].isin(['DRWRCNTRY', 'RBCNTRY', 'CBCNTRY'])]
答案 1 :(得分:1)
您可以使用np.where
和isin
假设您有一个名为countrylist的列表,其中包含SAUDI
countrylist = ['SAUDI']
df['code'] = np.where((df['code'] == 'CBCNTRY')| (df['code'] == 'RBCNTRY') | (df['code'] == 'DRWRCNTRY'),
df['code'], np.nan
)
df['code'] = np.where(df['entity'].isin(countrylist), df['code'], np.nan)
df.dropna(how='any', inplace= True)
print(df)
pageno entity code rawentity
17727425 SAUDI CBCNTRY saudi
答案 2 :(得分:1)
根据Gerardo的建议,使用pd.isin
并使用布尔运算符组合表达式:
countrylist = ['SAUDI']
codelist = ['DRWRCNTRY', 'RBCNTRY', 'CBCNTRY']
df = df[(df['code'].isin(codelist)) & (df['entity'].isin(countrylist))]
产生
pageno entity code rawentity
0 17727425 SAUDI CBCNTRY saudi