基于行和多列的数据帧列

2024-04-27 07:32:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我有下面的数据框,我希望在明年添加一个名为open\u的新列

将通过比较两列来选择此列财政年度+1和股票代码。 然后使用列中的值打开

原始数据帧:

   fiscalYear ticker     open  
         2017   FINL  17.4880  
         2017   AAPL  17.4880  
...
         2016   FINL  16.4880  
         2016   AAPL  16.4880  
         2015   FINL  15.4880  
         2015   AAPL  15.4880  

所需数据帧:

   fiscalYear ticker     open  open_next_year
         2017   FINL  17.4880  
         2017   AAPL  17.4880  
         2016   FINL  16.4880  17.4880 
         2016   AAPL  16.4880  17.4880
         2015   FINL  15.4880  16.4880 
         2015   AAPL  15.4880  16.4880

请问,实现这一目标的方法是什么


Tags: 数据方法目标原始数据openyearnext股票代码
2条回答

下面是另一种先创建地图的方法

m = dict(zip(tuple(zip(df.fiscalYear - 1, df.ticker)),df.open))
df['open_next_year'] = df[['fiscalYear','ticker']].apply(tuple, 1).map(m)

地图/字典如下所示,通过将第1年、股票代码和开放值压缩在一起获得:

{(2014, 'AAPL'): 15.488,
 (2014, 'FINL'): 15.488,
 (2015, 'AAPL'): 16.488,
 (2015, 'FINL'): 16.488,
 (2016, 'AAPL'): 17.488,
 (2016, 'FINL'): 17.488}

完整示例:

data = '''\
fiscalYear ticker    open
2017   FINL  17.488
2017   AAPL  17.488
2016   FINL  16.488
2016   AAPL  16.488
2015   FINL  15.488
2015   AAPL  15.488'''

fileobj = pd.compat.StringIO(data)
df = pd.read_csv(fileobj, sep='\s+')

m = dict(zip(tuple(zip(df.fiscalYear - 1, df.ticker)),df.open))
df['open_next_year'] = df[['fiscalYear','ticker']].apply(tuple, 1).map(m)

print(df)

返回:

   fiscalYear ticker    open  open_next_year
0        2017   FINL  17.488             NaN
1        2017   AAPL  17.488             NaN
2        2016   FINL  16.488          17.488
3        2016   AAPL  16.488          17.488
4        2015   FINL  15.488          16.488
5        2015   AAPL  15.488          16.488

我认为每个群体都需要通过^{}改变所有价值观:

df['open_next_year'] = df.groupby('ticker')['open'].shift()
print (df)
   fiscalYear ticker    open  open_next_year
0        2017   FINL  17.488             NaN
1        2017   AAPL  17.488             NaN
2        2016   FINL  16.488          17.488
3        2016   AAPL  16.488          17.488
4        2015   FINL  15.488          16.488
5        2015   AAPL  15.488          16.488

更改了唯一open值的示例:

print (df)
   fiscalYear ticker     open
0        2017   FINL  17.4881
1        2017   AAPL  17.4882
2        2016   FINL  16.4883
3        2016   AAPL  16.4884
4        2015   FINL  15.4885
5        2015   AAPL  15.4886

df['open_next_year'] = df.groupby('ticker')['open'].shift()
print (df)
   fiscalYear ticker     open  open_next_year
0        2017   FINL  17.4881             NaN
1        2017   AAPL  17.4882             NaN
2        2016   FINL  16.4883         17.4881
3        2016   AAPL  16.4884         17.4882
4        2015   FINL  15.4885         16.4883
5        2015   AAPL  15.4886         16.4884

相关问题 更多 >