簡體   English   中英

Pandas 從同一數據框中查找條件,然后添加到右側作為新列

[英]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 的語法,任何幫助將不勝感激。

謝謝!

  1. 正確的方法是創建一個Date列(因為您可能有多個年份,您不能只在月份加入)
  2. 然后,將數據幀合並回自身,但使用+ pd.DateOffset(months=1)移動一個月。 並加入Dateid

#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.

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