python - Pandas 使用查询
问题描述
我正在研究一个更大的代码问题,并试图分解简单的部分,以便我能理解它们。我现在正在尝试了解 pandas 查询功能。我复制了一个小例子供我学习。
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 的数据框,其中包含四列:
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.
从 AZ 按字母顺序按 cast_member_1 对结果进行排序,并按从 AZ 按字母顺序按 cast_member_2 排序来打破任何平局。将 avg_score 的结果四舍五入到两 (2) 位小数。
删除重复项。
电影数据框很大,但有点如下:
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
演员数据帧遵循以下格式:
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
解决方案代码如下:
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 在哪里被声明为使用变量。
解决方案
您可以使用 less 运算符比较字符串列,但显然它没有理由。
print(df)
nameA nameB
0 Donald Donald
1 Daffy Daffy
2 Minnie Minnie
具有相同输出的替代解决方案是boolean indexing
与布尔掩码一起使用 - 这里可以看到比较只返回False
值,因此输出为空DataFrame
:
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: []
推荐阅读
- arrays - Flutter json解码_TypeError(类型'List
' 不是类型 'Map 的子类型 ') - python-3.x - 如何使用正则表达式获取“JRLbr6THaTI”链接的 ID?
- r - grep 特定部分或数字/单词,带有 R,包含在文本文件中
- java - 如何使用 JPA 从多列构造模型实例
- terraform - Terraform 计数/可用区
- javascript - 在反应组件中获取枚举描述
- python - 错误:使用 load_table_from_json 将数据插入 BigQuery 时,字段 X“已将类型从 NUMERIC 更改为 FLOAT”
- java - 使用 SharedPreferences 保存/加载时忽略字符串 ArrayList?
- reactjs - React Material-UI TextField 失去焦点与每个键
- javascript - React & Jest:如何为依赖于外部函数的组件编写测试