繁体   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