[英]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.