如果一列与值匹配,则从数据框中删除行-Python 3.6

问题描述 投票:0回答:2

我有一个csv,看起来像这样:

screen_name,tweet,following,followers,is_retweet,bot
narutouz16,Grad school is lonely.,59,20,0,0
narutouz16,RT @GetMadz: Sound design in this game is 10/10 game freak lied. ,59,20,1,0
narutouz16,@hbthen3rd I know I don't.,59,20,0,0
narutouz16,"@TonyKelly95 I'm still not satisfied in the ending, even though its longer.",59,20,0,0
narutouz16,I'm currently in second place in my leaderboards in duolongo.,59,20,0,0

我可以使用以下命令将其读入dataframe

df = pd.read_csv("file.csv")

效果很好。当我print(df.shape)获得以下尺寸(1223726, 6)

我有一个用户名列表,如下所示:

bad_names = ['BELOZEROVNIKIT',  'ALTMANBELINDA',    '666STEVEROGERS',   'ALVA_MC_GHEE',     'CALIFRONIAREP',    'BECCYWILL',    'BOGDANOVAO2',  'ADELE_BROCK',  'ANN1EMCCONNELL',   'ARONHOLDEN8',  'BISHOLORINE',  'BLACKTIVISTSUS',   'ANGELITHSS',   'ANWARJAMIL22',     'BREMENBOTE',   'BEN_SAR_GENT',     'ASSUNCAOWALLAS',   'AHMADRADJAB',  'AN_N_GASTON',  'BLACK_ELEVATION',  'BERT_HENLEY',  'BLACKERTHEBERR5',  'ARTHCLAUDIA',  'ALBERTA_HAYNESS',  'ADRIANAMFTTT']

[我想做的是遍历数据帧,如果username完全在此列表中,请从df中删除这些行,并将它们添加到名为df的新bad_names_df中。

伪代码看起来像:

for each row in df:
    if row.username in bad_names:
        bad_names_df.append(row)
        df.remove(row)
    else:
        continue

我的尝试:

for row, col in df.iterrows():
    if row['username'] in bad_user_names:
        new_df.append(row)
    else:
        continue

如何(有效)遍历df,行数超过120万,如果用户名在bad_names列表中,请删除该行并将该行添加到bad_names_df?我没有找到其他任何可以解决此问题的SO帖子。

python pandas
2个回答
1
投票

您也可以使用isin创建遮罩:

mask = df["screen_name"].isin(bad_names)
print (df[mask])  #df of bad names
print (df[~mask]) #df of good names

0
投票

您可以应用lambda然后按如下所示进行过滤:

df['keep'] = df['username'].apply(lambda x: False if x in bad_names else True)
df = df[df['keep']==True]

-1
投票

在一行中使用isin:

bad_names_df = df[df['screen_name].isin(bad_names)]
© www.soinside.com 2019 - 2024. All rights reserved.