2017-07-03 93 views
1

比較幾個dataframes當我有三個dataframes:創建在數據幀中的列大熊貓

  df1     df2     df3 
    scale year week   n_u   Code H_k year week n_u 
0 -23 2016 20   131  002.55 1 2016 20  132 
1 -22 2016 21   132  002.55 1 2016 23  132 
2 -21 2016 22   ...  002.44 2 2016 22  131 
              002.32 1 2016 20  131 
              002.55 1 2016 22  131 
              002.55 1 2016 24  132 
              002.55 1 2016 21  132 
              002.55 1 2016 21  131 
              002.55 1 2016 24  131 
              002.55 2 2016 21  131 
              002.55 3 2016 22  132 
              002.55 1 2016 22  132 
...           ... 

另外我有一個變量c1 = 002.55。每次我設置這個變量的值。

我需要做到以下幾點:

在DF3選中所有行,如果在列「守則」的值等於C1。

然後從df2中找到列n_u中的所有值(此列中的值可以不同)。對於每個獨特的值,我需要在df1中創建一個列。

並計算df1中每行的H_k列的df3中的值的總和。我需要在數據框df1和df3中進行數年和數週的比較(年和周可以不同)。

結果應該是這樣的:

    df1     
    scale year week 131 132 
0 -23 2016 20  1  1 
1 -22 2016 21  3  1 
2 -21 2016 22  1  4  
... 

我希望的例子會給一個更好的瞭解。

而這一切都是在「scale」列中的值不等於零之前完成的。

我想我可以使用lambda。但我不知道如何寫這樣的條件。

UPD我會試着更好地描述算法:在df2['n_u']

對於每個唯一值創建新列:

選擇在df3其中df3['Code'] = c1

雖然scale = 0的所有行!在df1(通常可以實現嗎?)

df1['each unique value from df2'] = sum values from df3['H_k'] on condition df1['year'] = df3['year'] df1['week'] = df3['week']

回答

1

首先由boolean indexingisin過濾,然後groupby和聚合sumunstack重塑。

最後過濾df1通過scaledfjoindf1

c1 = '002.55' 
df = df3[(df3['Code'] == c1) & (df3['n_u'].isin(df2['n_u']))] 
df = df.groupby(['year','week', 'n_u'])['H_k'].sum().unstack(fill_value=0) 
print (df) 
n_u  131 132 
year week   
2016 20  0 1 
    21  3 1 
    22  1 4 
    23  0 1 
    24  1 1 

df = df1[df1['scale'] < 0].join(df, on=['year','week']) 
print (df) 
    scale year week 131 132 
0 -23 2016 20 0 1 
1 -22 2016 21 3 1 
2 -21 2016 22 1 4