簡體   English   中英

根據來自另一個數據集中的列的條件創建新列

[英]Create a new column based on condition from a column in another dataset

我有一個奇怪的熊貓問題,我不知道如何開始。 以下是我的兩個數據集的示例:

df1:這個數據集每個州都有一個年度指標。

Metric   Year    State
8        1996    AL
6        1997    AL
4        1998    AL
5        1999    AL
7        2000    AL
20       2001    AL
21       2002    AL
20       2003    AL
34       1996    CA
35       1997    CA
36       1998    CA
22       1999    CA
20       2000    CA
22       2001    CA
24       2002    CA

df2:該數據集有一項法律(我將其稱為 ID)在當年為該州制定。

ID      State    Year
ABC123  AL       1999
DEF456  AL       2000
GHI789  AL       2001
JKL012  AL       2001
PQR678  CA       1999
STU901  CA       2000
YZA567  CA       2001

我想確定在該州為每個 ID 制定法律之前和之后的指標平均值是否存在顯着差異。 我基本上想要 df2 中的第四列,它只是 avg(metric after) - avg(metric before)。 我的第一直覺是使用 np.where 語句,但不確定如何正確編寫該語句。 這是我的嘗試:

df2['diff'] = np.where((df2['Year']==2000) & (df2['State']=='AL'),df1[df1['Year']<2000]['Metric'].mean()-df1[df1'Year']>2000]['Metric'].mean(),0)

我知道這是不正確的,因為替代條件只是 0,這僅適用於年份 = 2000 和阿拉巴馬州的條件。 它也不會從計算中過濾掉加利福尼亞的指標。

所以,我正在尋找的是一種迭代方式來獲得每個州年組合的差異。

任何幫助,將不勝感激! 謝謝!

首先在State上對df1df2進行完全外連接:

df3 = df2.merge(df1, on='State', suffixes=('', '_metric'))

然后獲取每個IDStateYear組合引入法律之前和之后的平均指標:

df3.groupby(['ID', 'State', 'Year']).apply(
    lambda x: pd.Series([x.loc[x.Year_metric < x.Year, 'Metric'].mean(),
                         x.loc[x.Year_metric > x.Year, 'Metric'].mean()],
                         index=['before', 'after'])
    )

結果:

                   before      after
ID     State Year                   
ABC123 AL    1999    6.00  17.000000
DEF456 AL    2000    5.75  20.333333
GHI789 AL    2001    6.00  20.500000
JKL012 AL    2001    6.00  20.500000
PQR678 CA    1999   35.00  22.000000
STU901 CA    2000   31.75  23.000000
YZA567 CA    2001   29.40  24.000000

要查看差異,您可以改為:

df3.groupby(['ID', 'State', 'Year'], as_index=False).apply(
    lambda x: x.loc[x.Year_metric > x.Year, 'Metric'].mean() -
              x.loc[x.Year_metric < x.Year, 'Metric'].mean()
    ).rename(columns={None: 'Difference'})

結果:

       ID State  Year  Difference
0  ABC123    AL  1999   11.000000
1  DEF456    AL  2000   14.583333
2  GHI789    AL  2001   14.500000
3  JKL012    AL  2001   14.500000
4  PQR678    CA  1999  -13.000000
5  STU901    CA  2000   -8.750000
6  YZA567    CA  2001   -5.400000

暫無
暫無

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

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