首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用条件和列表更新Pandas列

使用条件和列表更新Pandas列
EN

Stack Overflow用户
提问于 2019-04-07 03:53:03
回答 2查看 53关注 0票数 4

这与其他一些问题类似,但我找不到适合我需求的答案。

我有一个包含以下内容的Dataframe:

代码语言:javascript
运行
复制
RK  PLAYER                SCHOOL    YEAR    POS POS RK  HT  WT  2019    2018    2017    2016
0   1   Nick Bosa         Ohio St.  Jr      EDGE    1   6-4 266 Jr   
1   2   Quinnen Williams  Alabama   Soph    DL      1   6-3 303 Soph    
2   3   Josh Allen        Kentucky  Sr      EDGE    2   6-5 262 Sr  
3   4   Ed Oliver         Houston   Jr      DL      2   6-2 287 Jr  

2018、2017和2016有np.NaN的值;但是我不能正确地格式化这个表。

现在我有一个单独的列表,其中包含以下内容:

代码语言:javascript
运行
复制
season = ['Sr', 'Jr', 'Soph', 'Fr']

2019列表示他们的当前状态,我希望2018列显示他们截至前一年的状态。因此,如果是'Sr',就应该是'Jr‘。本质上,我要做的是让列检查季节中的值,将其向前移动一个索引,然后将该值返回到列中。2018年的结果应该是:

代码语言:javascript
运行
复制
RK  PLAYER               SCHOOL YEAR        POS POS RK  HT  WT  2019 2018   2017    2016
0   1   Nick Bosa         Ohio St.  Jr      EDGE    1   6-4 266 Jr   Soph
1   2   Quinnen Williams  Alabama   Soph    DL      1   6-3 303 Soph Fr 
2   3   Josh Allen        Kentucky  Sr      EDGE    2   6-5 262 Sr   Jr
3   4   Ed Oliver         Houston   Jr      DL      2   6-2 287 Jr   Soph

我可以想出一种方法,在iteritem中使用for k,v循环来检查值,但我想知道是否有更好的方法?

EN

回答 2

Stack Overflow用户

发布于 2019-04-07 04:53:28

我不确定这是不是比你已经拥有的更聪明,但这是一个建议

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


def get_season(curr_season, curr_year, prev_year):
    season = ['Sr', 'Jr', 'Soph', 'Fr']

    try:
        return season[season.index(curr_season) + (curr_year - prev_year)]
    except IndexError:
        # Return some meaningful meassage perhaps?
        return '-'

df = pd.DataFrame({'2019': ['Jr', 'Soph', 'Sr', 'Jr']})

df['2018'] = [get_season(s, 2019, 2018) for s in df['2019']]
df['2017'] = [get_season(s, 2019, 2017) for s in df['2019']]
df['2016'] = [get_season(s, 2019, 2016) for s in df['2019']]


df
Out[18]: 
   2019  2018  2017 2016
0    Jr  Soph    Fr    -
1  Soph    Fr     -    -
2    Sr    Jr  Soph   Fr
3    Jr  Soph    Fr    -
票数 2
EN

Stack Overflow用户

发布于 2019-04-07 08:13:42

另一种可能的解决方案是编写一个接受行的函数,对从'2019‘值开始的seasons列表进行切片,并将该切片作为pandas.Series返回。然后,我们可以使用apply()将该函数应用于列。我使用了您的输入DataFrame的一部分进行测试。

代码语言:javascript
运行
复制
In [3]: df
Out[3]: 
    WT  2019  2018  2017  2016
0  266    Jr   NaN   NaN   NaN
1  303  Soph   NaN   NaN   NaN
2  262    Sr   NaN   NaN   NaN
3  287    Jr   NaN   NaN   NaN

In [4]: def fill_row(row):
   ...:     season = ['Sr', 'Jr', 'Soph', 'Fr']
   ...:     data = season[season.index(row['2019']):]
   ...:     return pd.Series(data)


In [5]: cols_to_update = ['2019', '2018', '2017', '2016']

In [6]: df[cols_to_update] = df[cols_to_update].apply(fill_row, axis=1)

In [7]: df
Out[7]: 
    WT  2019  2018  2017 2016
0  266    Jr  Soph    Fr  NaN
1  303  Soph    Fr   NaN  NaN
2  262    Sr    Jr  Soph   Fr
3  287    Jr  Soph    Fr  NaN
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55552905

复制
相关文章

相似问题

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