![](/img/trans.png)
[英]Pandas generates a column based by matching the dataframe columns to multiple other columns
[英]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.