这与其他一些问题类似,但我找不到适合我需求的答案。
我有一个包含以下内容的Dataframe:
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的值;但是我不能正确地格式化这个表。
现在我有一个单独的列表,其中包含以下内容:
season = ['Sr', 'Jr', 'Soph', 'Fr']
2019列表示他们的当前状态,我希望2018列显示他们截至前一年的状态。因此,如果是'Sr',就应该是'Jr‘。本质上,我要做的是让列检查季节中的值,将其向前移动一个索引,然后将该值返回到列中。2018年的结果应该是:
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循环来检查值,但我想知道是否有更好的方法?
发布于 2019-04-07 04:53:28
我不确定这是不是比你已经拥有的更聪明,但这是一个建议
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 -
发布于 2019-04-07 08:13:42
另一种可能的解决方案是编写一个接受行的函数,对从'2019‘值开始的seasons
列表进行切片,并将该切片作为pandas.Series
返回。然后,我们可以使用apply()
将该函数应用于列。我使用了您的输入DataFrame的一部分进行测试。
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
https://stackoverflow.com/questions/55552905
复制相似问题