簡體   English   中英

基於行和多列的pandas dataframe列

[英]pandas dataframe column based on row and multiple columns

我有以下數據 ,我想添加一個名為open_next_year的新列。

將通過比較兩列來選擇此列; 財政年度 +1和股票代號 然后使用open列中的值。

原始數據框:

   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

請問熊貓有什么辦法做到這一點?

我相信每個組都需要通過DataFrameGroupBy.shift移動所有值:

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

這是首先創建地圖的另一種方法。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM