如何使用 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)'))))]
我正在使用如下所示的 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)'))))]