[英]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
上對df1
和df2
進行完全外連接:
df3 = df2.merge(df1, on='State', suffixes=('', '_metric'))
然后獲取每個ID
、 State
、 Year
組合引入法律之前和之后的平均指標:
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.