如何使用 pandas 数据框的特定行和列创建新系列?

How can I create a new series by using specific rows and columns of a pandas data frame?

我正在使用如下所示的 pandas 数据框:

       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 的每一行创建一个包含标题、view_count、comment_count、like_count 和 dislike_count 的新系列如果dog_tag的值为[狗]。我不应该为 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"]

因为如果将空列表转换为布尔值 get False 您可以使用 boolean indexing with DataFrame.loc 按条件和列名列表进行过滤:

cols = ['title', 'view_count', 'comment_count', 'like_count', 'dislike_count', 'dog_tag']
df = df.loc[df['dog_tag'].astype(bool), cols]

你可以试试这个:

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)'))))]