首页 > 解决方案 > 使用其他列中的连续差异创建数据框列

问题描述

我有一个这样的数据框列:

    Index LtoR MSR LtoR CSR    x
0     0.0        0        0     0      
1     1.0      0.5        0   0.5       
2     2.0        1       15  1.15         
3     3.0        1       31  1.31   
4     4.0      1.5        0   1.5   
5     5.0      1.5       16  1.66
6     6.0        2       24  2.24


我想创建一个新列,以便考虑 2 xl 值之间的差异。所以我想做类似的事情

    Index LtoR MSR LtoR CSR    x   Width L
0     0.0        0        0     0  (x2 - x0)/2 = 1.15/2 = 0.575
1     1.0      0.5        0   0.5  (x3 - x1)/2 = 0.81/2 = 0.405
2     2.0        1       15  1.15  
3     3.0        1       31  1.31  
4     4.0      1.5        0   1.5  
5     5.0      1.5       16  1.66  
6     6.0        2       24  2.24  

我尝试了以下代码:

for i in range(0,10):
    df['New Col'] = ((np.float64(df['x'][i+2]) - np.float64(2['x'][i]))/2)

但这会返回有关复制值与查看值的错误。那我该怎么办?

标签: pythonpandasdataframe

解决方案


您可以使用.shift()获取 (row+2)-th 条目并设置公式如下:

df['Width L'] = (df['x'].shift(-2) - df['x']) / 2 

结果:

print(df)

   Index  LtoR MSR  LtoR CSR     x  Width L
0    0.0       0.0         0  0.00    0.575
1    1.0       0.5         0  0.50    0.405
2    2.0       1.0        15  1.15    0.175
3    3.0       1.0        31  1.31    0.175
4    4.0       1.5         0  1.50    0.370
5    5.0       1.5        16  1.66      NaN
6    6.0       2.0        24  2.24      NaN

如果您希望最后 2 个条目不存在NaN并取 的原始值x,则可以另外使用.fillna(),如下所示:

df['Width L'] = ((df['x'].shift(-2) - df['x']) / 2).fillna(df['x'])

结果:

print(df)

   Index  LtoR MSR  LtoR CSR     x  Width L
0    0.0       0.0         0  0.00    0.575
1    1.0       0.5         0  0.50    0.405
2    2.0       1.0        15  1.15    0.175
3    3.0       1.0        31  1.31    0.175
4    4.0       1.5         0  1.50    0.370
5    5.0       1.5        16  1.66    1.660
6    6.0       2.0        24  2.24    2.240

或者,如果您想将不可用的第 (row+2) 个条目视为0,可以使用fill_value参数 .shift()设置 的默认值0,如下所示:

df['Width L'] = (df['x'].shift(-2, fill_value=0) - df['x']) / 2

结果:

print(df)

   Index  LtoR MSR  LtoR CSR     x  Width L
0    0.0       0.0         0  0.00    0.575
1    1.0       0.5         0  0.50    0.405
2    2.0       1.0        15  1.15    0.175
3    3.0       1.0        31  1.31    0.175
4    4.0       1.5         0  1.50    0.370
5    5.0       1.5        16  1.66   -0.830
6    6.0       2.0        24  2.24   -1.120

推荐阅读