Pandas小册子:根据条件创建新的列

举报
Lemon|Python数据之道 发表于 2018/11/23 09:54:28 2018/11/23
【摘要】 在进行数据分析时,经常会遇到根据已有的数据列,按照一定条件创建新的数据列,然后进行进一步分析。今天,我们来看一个根据已有数据按照一定条件创建新的数据列的方法。数据如下:import pandas as pddf = pd.DataFrame({'team_A': ['Spain', 'Germany', 'Brazil', 'France'], 'team_...

image.png

在进行数据分析时,经常会遇到根据已有的数据列,按照一定条件创建新的数据列,然后进行进一步分析。

今天,我们来看一个根据已有数据按照一定条件创建新的数据列的方法。

数据如下:

  1. import pandas as pd

  2. df = pd.DataFrame({'team_A': ['Spain', 'Germany', 'Brazil', 'France'],

  3.                  'team_B': ['USA', 'Argentina', 'Mexico', 'Belgium'],

  4.                  'score_A': [5, 3, 2, 0],

  5.                  'score_B': [4, 0, 3, 0]},

  6.                 columns = ['team_A', 'team_B', 'score_A', 'score_B'])

  7. df

  8. Out[2]:

  9.    team_A     team_B  score_A  score_B

  10. 0    Spain        USA        5        4

  11. 1  Germany  Argentina        3        0

  12. 2   Brazil     Mexico        2        3

  13. 3   France    Belgium        0        0


问题: 从上面数据中创建新的一个数据列,用来存储获胜队伍的名称。

即,根据 “score_A” 与 “score_B” 比较的结果,来获取相应的结果。

例如,第一行, “Spain”:”USA” 为 5:4 , “Spain” 获胜, 新创建的列中存储的结果为 “Spain”。

下面介绍两种方法来实现上述要求。


第一种方法

第一种方法是 利用 Pandas 中 DataFrame 的条件选择功能来实现,过程如下:

  1. # 创建新的列 "win_team",赋值为空白

  2. df['win_team'] = ''

  3. # 创建判断条件 mask

  4. mask = df['score_A'] - df['score_B']

  5. df.loc[mask > 0, 'win_team'] = df.loc[mask > 0, 'team_A']

  6. df.loc[mask < 0, 'win_team'] = df.loc[mask < 0, 'team_B']

  7. df.loc[mask == 0, 'win_team'] = 'Draw'

  8. df

  9. Out[3]:

  10.    team_A     team_B  score_A  score_B win_team

  11. 0    Spain        USA        5        4    Spain

  12. 1  Germany  Argentina        3        0  Germany

  13. 2   Brazil     Mexico        2        3   Mexico

  14. 3   France    Belgium        0        0     Draw


第二种方法

第二种方法是结合 DataFrame.iterrows() 以及 Python 的 list 的功能来实现,过程如下:

  1. # The second method to get the winners

  2. def find_win_team(df):

  3.    winners = []

  4.    for i, row in df.iterrows():

  5.        if row['score_A'] > row['score_B']:

  6.            winners.append(row['team_A'])

  7.        elif row['score_A'] < row['score_B']:

  8.            winners.append(row['team_B'])

  9.        else:

  10.            winners.append('Draw')

  11.    return winners

  12. df['winner'] = find_win_team(df)

  13. df

  14. Out[4]:

  15.    team_A     team_B  score_A  score_B win_team   winner

  16. 0    Spain        USA        5        4    Spain    Spain

  17. 1  Germany  Argentina        3        0  Germany  Germany

  18. 2   Brazil     Mexico        2        3   Mexico   Mexico

  19. 3   France    Belgium        0        0     Draw     Draw

关于 DataFrame.iterrows(), 我们先来看看其运行结果。
  1. for row_index, row in df.iterrows():

  2.    print('%s\n%s' % (row_index, row))

  3. 0

  4. team_A      Spain

  5. team_B        USA

  6. score_A         5

  7. score_B         4

  8. win_team    Spain

  9. winner      Spain

  10. Name: 0, dtype: object

  11. 1

  12. team_A        Germany

  13. team_B      Argentina

  14. score_A             3

  15. score_B             0

  16. win_team      Germany

  17. winner        Germany

  18. Name: 1, dtype: object

  19. 2

  20. team_A      Brazil

  21. team_B      Mexico

  22. score_A          2

  23. score_B          3

  24. win_team    Mexico

  25. winner      Mexico

  26. Name: 2, dtype: object

  27. 3

  28. team_A       France

  29. team_B      Belgium

  30. score_A           0

  31. score_B           0

  32. win_team       Draw

  33. winner         Draw

  34. Name: 3, dtype: object


fDataFrame.iterrows() 的作用是将 dataframe的每行转换成为一个 Series,可以理解为 针对于每一行,做了行列转置。

图示如下:

image.png



【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。