Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
获取python数据帧中某些列值的最大绝对值_Python_Pandas_Dataframe - Fatal编程技术网

获取python数据帧中某些列值的最大绝对值

获取python数据帧中某些列值的最大绝对值,python,pandas,dataframe,Python,Pandas,Dataframe,给定数据帧df: year num 1982 -4 1983 -7 1983 5 1984 -1 1986 0 ... 2008 47 2009 -5 2009 -2 2009 17 2009 84 我已按年对df进行排序,然后按升序对num进行排序,如图所示。我的目标是找到每个年num的最大绝对值,然后创建一个新列new,解释为num除以行所在年num的最大绝对值 因此,df的第一个

给定数据帧
df

year      num
1982      -4
1983      -7
1983      5
1984      -1
1986      0
...
2008      47
2009      -5
2009      -2
2009      17
2009      84
我已按
df
进行排序,然后按升序对
num
进行排序,如图所示。我的目标是找到每个
num
的最大绝对值,然后创建一个新列
new
,解释为
num
除以行所在
num
的最大绝对值

因此,
df的第一个和最后五个值应如下所示:

year      num       newnum
1982      -4        -1
1983      -7        -1
1983      5         -0.7143
1984      -1        -1
1986      0         0
...
2008      47        1
2009      -5        -0.0595
2009      -2        -0.0238
2009      17        0.2024
2009      84        1
我考虑单独创建一个绝对值列来进行列比例划分,例如

df['absnum'] = df.num.abs()
然后找到它的
max
值,但是我遇到了一个问题,无法按
year
对那些
absnum
值进行分类。是否有一种有效的方法来计算每行的
newnum

用于通过除以获得最大绝对值:

新增栏目:

df['absnum'] = df.num.abs()

df['new'] = df['num'].div(df.groupby('year')['absnum'].transform('max'))
print (df)
   year  num  absnum       new
0  1982   -4       4 -1.000000
1  1983   -7       7 -1.000000
2  1983    5       5  0.714286
3  1984   -1       1 -1.000000
4  1986    0       0       NaN
5  2008   47      47  1.000000
6  2009   -5       5 -0.059524
7  2009   -2       2 -0.023810
8  2009   17      17  0.202381
9  2009   84      84  1.000000
最后,如有必要,用
0
替换缺少的值:

df['new'] = df['new'].fillna(0)
df['new'] = df['new'].fillna(0)