![](/img/trans.png)
[英]pandas: add new column based on datetime index lookup of same dataframe
[英]Pandas lookup from same dataframe for criteria then add to right as new column
我的目標是在 python 中創建一個 excel-vlookup-equivalent,它采用上個月的值並將其添加到當前月份的新列中,即 id、month、value_current_month、value_past_month:
由此:
id month value
01 09 123
02 09 234
03 09 345
01 08 543
02 08 432
03 08 321
01 07 678
02 07 789
03 07 890
.. .. ...
對此:
id month value new
01 09 123 543
02 09 234 432
03 09 345 321
01 08 543 678
02 08 432 789
03 08 321 890
01 07 678 ...
02 07 789 ...
03 07 890 ...
.. .. ... ...
我已經導入了 pandas 和 numpy 並創建了一個名為“df”的數據框。 由於我不熟悉 python 的語法,任何幫助將不勝感激。
謝謝!
Date
列(因為您可能有多個年份,您不能只在月份加入)+ pd.DateOffset(months=1)
移動一個月。 並加入Date
和id
:#sample dataframe setup
import pandas as pd
df = pd.DataFrame({'id': {0: '01',1: '02',2: '03',3: '01',4: '02',5: '03',6: '01',7: '02',8: '03'},
'month': {0: '09',1: '09',2: '09',3: '08',4: '08',5: '08', 6: '07',7: '07',8: '07'},
'value': {0: 123,1: 234,2: 345,3: 543,4: 432,5: 321, 6: 678,7: 789,8: 890}})
df
#solution 1
df['Year'] = '2020'
df['Date'] = pd.to_datetime(df['Year'] + '-' + df['month'])
df = (pd.merge(df, df[['Date', 'value', 'id']].rename({'value' : 'new_value'}, axis=1)
.assign(Date=df['Date'] + pd.DateOffset(months=1)),
how='left', on=['Date' , 'id']).drop('Date', axis=1))
df
Out[1]:
id month value Year new_value
0 1 09 123 2020 543.0
1 2 09 234 2020 432.0
2 3 09 345 2020 321.0
3 1 08 543 2020 678.0
4 2 08 432 2020 789.0
5 3 08 321 2020 890.0
6 1 07 678 2020 NaN
7 2 07 789 2020 NaN
8 3 07 890 2020 NaN
使用.shift(-3)
。 如果問題很簡單並且您每個月有三個 ID 值。 例如,如果您每個月的實際數據框中有 12 個id
值,您可以將-3
更改為-12
。 這也假設您已經對數據框進行了排序:
#solution 2
df['new'] = df['value'].shift(-3)
df
Out[2]:
id month value new
0 1 9 123 543.0
1 2 9 234 432.0
2 3 9 345 321.0
3 1 8 543 678.0
4 2 8 432 789.0
5 3 8 321 890.0
6 1 7 678 NaN
7 2 7 789 NaN
8 3 7 890 NaN
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.