我正在处理一个如下所示的熊猫数据框:
title view_count comment_count like_count dislike_count dog_tag cat_tag bird_tag other_tag
0 Great Dane Loves 299094 752.0 15167 58 [dog] [] [] []
1 Guy Loves His Cat 181320 1283.0 13254 262 [] [cat] [] []
基本上,标题代表YouTube视频的名称。如果视频是关于狗的,则可以在dog_tag类别下看到[dog]。如果不是关于狗的,则在dog_tag下会看到一个空列表[]。
如果dog_tag的值为[dog] ,我需要为dog_tag的每一行创建一个包含标题,view_count,comment_count,like_count和dislike_count的新系列。我不应该为dog_tag的值为[]的行添加任何信息。
所以,我的新系列应该看起来像这样:
title view_count comment_count like_count dislike_count dog_tag
0 Great Dane Loves 299094 752.0 15167 58 [dog]
1 Dogs are Soo Great!! 181320 1283.0 13254 262 [dog]
2 Dog and Little Girl 562585 5658.3 46589 121 [dog]
是否有任何 天才人物 可以解决此问题?我尝试了以下在Stack Overflow上找到的解决方案,但无法获得所需的:(
only_dog = [dodo_data.loc[:, dodo_data.loc[0,:].eq(s)] for s in ['dog_tag', 'view_count', 'comment_count', 'like_count', 'dislike_count','ratio_of_comments_per_view', 'ratio_of_likes_per_view']]
dodo_data.loc[:,dodo_data.iloc[0, :] == "dog_tag"]
dodo_data.loc[:,dodo_data.iloc[0, :] == "view_count"]
dodo_data.loc[:,dodo_data.iloc[0, :] == "comment_count"]
答案 0 :(得分:3)
因为如果将空列表转换为布尔值False
,则可以将boolean indexing
与DataFrame.loc
一起使用,以按条件和按列名列表进行过滤:
cols = ['title', 'view_count', 'comment_count', 'like_count', 'dislike_count', 'dog_tag']
df = df.loc[df['dog_tag'].astype(bool), cols]
答案 1 :(得分:-1)
您可以尝试以下方法:
import io
dff=io.StringIO("""title,view_count,comment_count,like_count,dislike_count,dog_tag,cat_tag,bird_tag,other_tag
Great Dane Loves,299094,752.0,15167,58,[dog],[],[],[]
Guy Loves His Cat,181320,1283.0,13254,262,[],[cat],[],[]""")
df2=pd.read_csv(dff)
df2 = df2[df2['dog_tag'] == '[dog]']
df2 = df2[df2.columns.drop(list(df2.filter(regex=(r'_tag(?<!dog_tag)'))))]