首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Pandas查询的使用

Pandas查询的使用
EN

Stack Overflow用户
提问于 2018-11-18 19:33:49
回答 1查看 85关注 0票数 0

我正在寻找一个更大的代码问题,并试图分解简单的部分,以便我可以理解它们。我现在正在尝试理解pandas查询功能。我已经为我的学习复制了一个小例子。

代码语言:javascript
复制
import pandas as pd

df = pd.DataFrame()

df['nameA'] = ['Donald','Daffy','Minnie']

df['nameB'] = ['Donald','Daffy','Minnie']

df2 = df.query('nameA < nameB')

print(df2)

我得到了一个空的数据帧,尽管我在一个更大的代码库中看到了一些完全类似的事情。有人能解释一下我的基本理解有什么缺陷吗?

我想通过按两列分组并获得名称的所有组合来跟进这一点,但没有重复。

我在试着分析几周前的一道试题。有两个数据帧,电影和演员。

任务如下:

创建一个名为good_teamwork的数据帧,其中包含四列:

代码语言:javascript
复制
cast_member_1 and cast_member_2, the names of each pair of cast members that appear in the same movie;
num_movies, the number of movies that each pair of cast members appears in; and
avg_score, the average review score for each of those movies containing the two cast members.

按字母顺序从A-Z按cast_member_1对结果进行排序,并通过按cast_member_2从A-Z按字母顺序对结果进行排序来打破所有平局。将avg_score的结果四舍五入为两(2)位小数。

删除重复项。

电影数据帧很大,但如下所示:

代码语言:javascript
复制
id   name                                                score
0   9   Star Wars: Episode III - Revenge of the Sith 3D         61
1   24214   The Chronicles of Narnia: The Lion, The Witch ...   46
2   1789    War of the Worlds   94
3   10009   Star Wars: Episode II - Attack of the Clones 3D     28
4   771238285   Warm Bodies                                      3

cast数据帧遵循以下格式:

代码语言:javascript
复制
movie_id  cast_id   cast_name
0   9   162652153   Hayden Christensen
1   9   162652152   Ewan McGregor
2   9   418638213   Kenny Baker
3   9   548155708   Graeme Blundell
4   9   358317901   Jeremy Bulloch

解决方案代码如下:

代码语言:javascript
复制
joined_df = cast.merge(cast, how='inner', left_on='movie_id', 
right_on='movie_id')
joined_df = joined_df.query('cast_name_x < cast_name_y')
good_teamwork2 = joined_df.merge(movies, how='inner', 
left_on='movie_id', right_on='id')
good_teamwork2 = good_teamwork2.groupby(['cast_name_x', 
'cast_name_y']).agg({'movie_id': 'size', 'score': 
'mean'}).reset_index()
good_teamwork2.columns = ['cast_member_1', 'cast_member_2', 
'avg_score', 'num_movies']
good_teamwork2 = good_teamwork2[good_teamwork2['avg_score'] >= 50]
good_teamwork2 = good_teamwork2[good_teamwork2['num_movies'] >= 3]
good_teamwork2 = good_teamwork2.round({'avg_score': 2})
good_teamwork2 = good_teamwork2.sort_values(by=['cast_member_1', 
'cast_member_2'], ascending=[True, True]).reset_index(drop=True)
good_teamwork2 = good_teamwork2[['cast_member_1', 'cast_member_2', 
'num_movies', 'avg_score']]

我主要是想了解查询语句和带有cast_name_x和cast_name_y的groupby语句是如何在没有任何重复项的情况下获得所有参与者组合的。我也不明白在哪里,例如,cast_name_x被声明为一个变量以供使用。

EN

回答 1

Stack Overflow用户

发布于 2018-11-18 19:39:11

你可以使用compare strings columns with less operator,但显然这是没有理由的。

代码语言:javascript
复制
print(df)
    nameA   nameB
0  Donald  Donald
1   Daffy   Daffy
2  Minnie  Minnie

具有相同输出的替代解决方案是使用带有布尔掩码的boolean indexing -这里可以看到比较只返回False值,因此输出为空DataFrame

代码语言:javascript
复制
mask = df['nameA'] < df['nameB']
print (mask)
0    False
1    False
2    False
dtype: bool

df2 = df[mask]
print (df2)
Empty DataFrame
Columns: [nameA, nameB]
Index: []

df2 = df.query('nameA < nameB')
print(df2)
Empty DataFrame
Columns: [nameA, nameB]
Index: []
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53360394

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档