如何根据其他行的条件创建列 - Pandas Dataframe?
How to create column based on conditions on other rows - Pandas Dataframe?
我有以下问题:
一个名为 df1 的数据框,如下所示:
Id PVF PM_year Year
0 A6489 75 25 2018
1 A175 56 54 2018
2 A2856 34 65 2018
3 A6489 35 150 2019
4 A175 45 700 2019
5 A2856 55 120 2019
6 A6489 205 100 2020
7 A2856 35 445 2020
我想创建一个名为 PM_previous_year 的新列,每个组合 (ID+Year) 都等于相同 ID 和前一年的 PM_year 的值...
示例:
对于索引为 3 的行,Id 为 'A6489',年份为 2019。因此新列“PM_previous_year”的值应该是 Id 所在行的值相同 ('A6489') 并且年份等于 2018 (2019-1)。在这个简单的示例中,它对应于索引为 0 的行,索引为 3 的行上的新列的预期值为 25。
最后,这个简短示例的目标 DataFrame df2 如下所示:
Id PVF PM_year Year PM_previous_year
0 A6489 75 25 2018 NaN
1 A175 56 54 2018 NaN
2 A2856 34 65 2018 NaN
3 A6489 35 150 2019 25.0
4 A175 45 700 2019 54.0
5 A2856 55 120 2019 65.0
6 A6489 205 100 2020 150.0
7 A2856 35 445 2020 120.0
我还没有找到任何明显的解决方案。也许有一种方法可以重塑 df,但我对此不是很熟悉。
如果有人有任何想法,我将不胜感激。
谢谢
如果可能,简化解决方案并根据 Id
移动 PM_year
使用:
df['PM_previous_year'] = df.groupby('Id')['PM_year'].shift()
print (df)
Id PVF PM_year Year PM_previous_year
0 A6489 75 25 2018 NaN
1 A175 56 54 2018 NaN
2 A2856 34 65 2018 NaN
3 A6489 35 150 2019 25.0
4 A175 45 700 2019 54.0
5 A2856 55 120 2019 65.0
6 A6489 205 100 2020 150.0
7 A2856 35 445 2020 120.0
或者:
s = df.pivot('Year','Id','PM_year').shift().unstack().rename('PM_previous_year')
df = df.join(s, on=['Id','Year'])
print (df)
Id PVF PM_year Year PM_previous_year
0 A6489 75 25 2018 NaN
1 A175 56 54 2018 NaN
2 A2856 34 65 2018 NaN
3 A6489 35 150 2019 25.0
4 A175 45 700 2019 54.0
5 A2856 55 120 2019 65.0
6 A6489 205 100 2020 150.0
7 A2856 35 445 2020 120.0
我有以下问题:
一个名为 df1 的数据框,如下所示:
Id PVF PM_year Year
0 A6489 75 25 2018
1 A175 56 54 2018
2 A2856 34 65 2018
3 A6489 35 150 2019
4 A175 45 700 2019
5 A2856 55 120 2019
6 A6489 205 100 2020
7 A2856 35 445 2020
我想创建一个名为 PM_previous_year 的新列,每个组合 (ID+Year) 都等于相同 ID 和前一年的 PM_year 的值...
示例:
对于索引为 3 的行,Id 为 'A6489',年份为 2019。因此新列“PM_previous_year”的值应该是 Id 所在行的值相同 ('A6489') 并且年份等于 2018 (2019-1)。在这个简单的示例中,它对应于索引为 0 的行,索引为 3 的行上的新列的预期值为 25。
最后,这个简短示例的目标 DataFrame df2 如下所示:
Id PVF PM_year Year PM_previous_year
0 A6489 75 25 2018 NaN
1 A175 56 54 2018 NaN
2 A2856 34 65 2018 NaN
3 A6489 35 150 2019 25.0
4 A175 45 700 2019 54.0
5 A2856 55 120 2019 65.0
6 A6489 205 100 2020 150.0
7 A2856 35 445 2020 120.0
我还没有找到任何明显的解决方案。也许有一种方法可以重塑 df,但我对此不是很熟悉。 如果有人有任何想法,我将不胜感激。 谢谢
如果可能,简化解决方案并根据 Id
移动 PM_year
使用:
df['PM_previous_year'] = df.groupby('Id')['PM_year'].shift()
print (df)
Id PVF PM_year Year PM_previous_year
0 A6489 75 25 2018 NaN
1 A175 56 54 2018 NaN
2 A2856 34 65 2018 NaN
3 A6489 35 150 2019 25.0
4 A175 45 700 2019 54.0
5 A2856 55 120 2019 65.0
6 A6489 205 100 2020 150.0
7 A2856 35 445 2020 120.0
或者:
s = df.pivot('Year','Id','PM_year').shift().unstack().rename('PM_previous_year')
df = df.join(s, on=['Id','Year'])
print (df)
Id PVF PM_year Year PM_previous_year
0 A6489 75 25 2018 NaN
1 A175 56 54 2018 NaN
2 A2856 34 65 2018 NaN
3 A6489 35 150 2019 25.0
4 A175 45 700 2019 54.0
5 A2856 55 120 2019 65.0
6 A6489 205 100 2020 150.0
7 A2856 35 445 2020 120.0