Pandas小册子:根据条件创建新的列
16lz
2021-01-22
在进行数据分析时,经常会遇到根据已有的数据列,按照一定条件创建新的数据列,然后进行进一步分析。
今天,我们来看一个根据已有数据按照一定条件创建新的数据列的方法。
数据如下:
import pandas as pddf = pd.DataFrame({'team_A': ['Spain', 'Germany', 'Brazil', 'France'], 'team_B': ['USA', 'Argentina', 'Mexico', 'Belgium'], 'score_A': [5, 3, 2, 0], 'score_B': [4, 0, 3, 0]}, columns = ['team_A', 'team_B', 'score_A', 'score_B'])dfOut[2]: team_A team_B score_A score_B0 Spain USA 5 41 Germany Argentina 3 02 Brazil Mexico 2 33 France Belgium 0 0
问题: 从上面数据中创建新的一个数据列,用来存储获胜队伍的名称。
即,根据 "scoreA" 与 "scoreB" 比较的结果,来获取相应的结果。
例如,第一行, "Spain":"USA" 为 5:4 , "Spain" 获胜, 新创建的列中存储的结果为 "Spain"。
下面介绍两种方法来实现上述要求。
第一种方法
第一种方法是 利用 Pandas 中 DataFrame 的条件选择功能来实现,过程如下:
# 创建新的列 "win_team",赋值为空白df['win_team'] = ''# 创建判断条件 maskmask = df['score_A'] - df['score_B']df.loc[mask > 0, 'win_team'] = df.loc[mask > 0, 'team_A']df.loc[mask < 0, 'win_team'] = df.loc[mask < 0, 'team_B']df.loc[mask == 0, 'win_team'] = 'Draw'dfOut[3]: team_A team_B score_A score_B win_team0 Spain USA 5 4 Spain1 Germany Argentina 3 0 Germany2 Brazil Mexico 2 3 Mexico3 France Belgium 0 0 Draw
第二种方法
第二种方法是结合 DataFrame.iterrows() 以及 Python 的 list 的功能来实现,过程如下:
# The second method to get the winnersdef find_win_team(df): winners = [] for i, row in df.iterrows(): if row['score_A'] > row['score_B']: winners.append(row['team_A']) elif row['score_A'] < row['score_B']: winners.append(row['team_B']) else: winners.append('Draw') return winnersdf['winner'] = find_win_team(df)dfOut[4]: team_A team_B score_A score_B win_team winner0 Spain USA 5 4 Spain Spain1 Germany Argentina 3 0 Germany Germany2 Brazil Mexico 2 3 Mexico Mexico3 France Belgium 0 0 Draw Draw
关于 DataFrame.iterrows(), 我们先来看看其运行结果。
for row_index, row in df.iterrows(): print('%s\n%s' % (row_index, row))0team_A Spainteam_B USAscore_A 5score_B 4win_team Spainwinner SpainName: 0, dtype: object1team_A Germanyteam_B Argentinascore_A 3score_B 0win_team Germanywinner GermanyName: 1, dtype: object2team_A Brazilteam_B Mexicoscore_A 2score_B 3win_team Mexicowinner MexicoName: 2, dtype: object3team_A Franceteam_B Belgiumscore_A 0score_B 0win_team Drawwinner DrawName: 3, dtype: object
DataFrame.iterrows() 的作用是将 dataframe的每行转换成为一个 Series,可以理解为 针对于每一行,做了行列转置。
图示如下:
END
Pandas小册子
Groupby概览 | 文本拆分 | 按指定list排序 |
更多相关文章
- Pandas小册子:日期数据处理 - 如何按日期筛选、显示及统计数据
- 2017年文章汇总 - Python数据之道
- Python数据类型-List介绍(下)-列表推导式
- Python数据类型-List介绍(上)
- 内卷?猝死?企业如何利用数据分析提升人效比,让员工远离“996”?
- 【工具】历史文章分类汇总-V6 | Python数据之道
- js中基础数据结构数组去重问题
- mysql group_concat 获取一对多的数据
- 【工具】历史文章分类汇总-V4 | Python数据之道