熊猫-如何创建从连续两行中的值派生的新列?

时间:2020-11-05 05:13:05

标签: python python-3.x pandas dataframe

我有以下数据框-

ID    Name   Distance   Time   Base    Height
1     A      10         2      12      2
2     A      20         4      14      3
3     B      30         6      16      4
4     B      40         8      18      5
5     C      50         10     20      6   
6     C      60         12     22      8

我想创建新列Speed, Tarea, Speed_ratio, Tarea_ratio,其值是从名称为A,B,C的行中的值派生的,如下所示-

ID    Name   Distance   Time   Base    Height   Speed    Tarea    Speed_ratio   Tarea_ratio
1     A      10         2      12      2        5        12       1             0.5714
2     A      20         4      14      3        5        21       NA            NA   
3     B      30         6      16      4        5        32       1             0.7111 
4     B      40         8      18      5        5        45       NA            NA
5     C      50         10     20      6        5        60       1             0.6818    
6     C      60         12     22      8        5        88       NA            NA 

可以做到吗?谢谢。

3 个答案:

答案 0 :(得分:3)

您可以执行以下操作:

In [431]: df['Speed'] = df.Distance.div(df.Time)
In [433]: df['Tarea'] = df.Base.mul(df.Height)/2

In [447]: df['Speed_ratio'] = df.Speed / df.groupby('Name').Speed.shift(-1)
    
In [450]: df['Tarea_ratio'] = df.Tarea / df.groupby('Name').Tarea.shift(-1)

In [451]: df
Out[451]: 
   ID Name  Distance  Time  Base  Height  Speed  Tarea  Speed_ratio  Tarea_ratio
0   1    A        10     2    12       2    5.0   12.0          1.0     0.571429
1   2    A        20     4    14       3    5.0   21.0          NaN          NaN
2   3    B        30     6    16       4    5.0   32.0          1.0     0.711111
3   4    B        40     8    18       5    5.0   45.0          NaN          NaN
4   5    C        50    10    20       6    5.0   60.0          1.0     0.681818
5   6    C        60    12    22       8    5.0   88.0          NaN          NaN

答案 1 :(得分:1)

您可以在列之间简单地使用运算符:

df["Speed"]=5
df["Tarea"]=df["Base"]*df["Height"]/2 # that column will have float values, if you want to have integer values, use astype() method.

答案 2 :(得分:1)

您可以使用df[key] = value来分配新列,就像对本机dict对象一样。对于您的特定情况,以下方法将起作用:

df["Speed"]       = df["Distance"] / df["Time"]
df["Tarea"]       = df["Base"] * df["Height"] / 2
df["Speed_ratio"] = df["Speed"].iloc[::2] / df["Speed"].iloc[1::2].values
df["Tarea_ratio"] = df["Tarea"].iloc[::2] / df["Tarea"].iloc[1::2].values

其中给出以下pandas.DataFrame

ID  Name  Distance  Time  Base  Height  Speed  Tarea  Speed_ratio  Tarea_ratio
 1     A        10     2    12       2    5.0   12.0          1.0     0.571429
 2     A        20     4    14       3    5.0   21.0          NaN          NaN
 3     B        30     6    16       4    5.0   32.0          1.0     0.711111
 4     B        40     8    18       5    5.0   45.0          NaN          NaN
 5     C        50    10    20       6    5.0   60.0          1.0     0.681818
 6     C        60    12    22       8    5.0   88.0          NaN          NaN