如何获得熊猫数据框中列的差异

时间:2020-12-30 03:36:46

标签: python-3.x pandas dataframe diff

我有一个数据集如下:

date        f1        f2        e1        e2
01/01/2020  40.0      10.0      100.0     15.0  
01/02/2020  30.0      20.0      200.0     25.0
01/03/2020  20.0      30.0      300.0     35.0
01/04/2020  10.0      40.0      400.0     25.0
01/05/2020  50.0      50.0      500.0     55.0
01/06/2020  60.0      60.0      600.0     15.0

我正在尝试将 {f1, f2} 和 {e1, e2} 之间的差异分别转换为下面给出的另一个数据帧:

date        h1        h2
01/01/2020  -60.0     -5.0
01/02/2020  -170.0    -5.0
01/03/2020  -280.0    -5.0
01/04/2020  -390.0    15.0
01/05/2020  -450.0    -5.0
01/06/2020  -540.0    45.0

是否有可能有效地做到这一点?谢谢。

3 个答案:

答案 0 :(得分:1)

如果你想功能化,这应该可行:

diff = lambda x, y: x - y
df['h1'] = list(map(diff, df['f1'], df['e1']))
df['h2'] = list(map(diff, df['f2'], df['e2']))

答案 1 :(得分:1)

您可以使用 numpy 广播一次计算两列

df1 = df['date'].to_frame()
df1[['h1','h2']] = df[['f1','f2']].sub(df[['e1','e2']].to_numpy())
df1

出:

         date     h1    h2
0  01/01/2020  -60.0  -5.0
1  01/02/2020 -170.0  -5.0
2  01/03/2020 -280.0  -5.0
3  01/04/2020 -390.0  15.0
4  01/05/2020 -450.0  -5.0
5  01/06/2020 -540.0  45.0

答案 2 :(得分:1)

最简单、更高效(最快)的方法是使用数据框的函数apply

df["h1"]=df.apply(lambda row: row["f1"]-row["e1"], axis=1)
df["h2"]=df.apply(lambda row: row["f2"]-row["e2"], axis=1)

使用此函数,您可以访问每一行,并计算一个新值,在本例中为一个简单的减法。如果操作更困难(使用“if”或其他),我强烈建议预定义如下函数(搜索均值):

def creating_2(row):
    return ((row["f2"]+row[e2])/2)

df["mean"]=df.apply(lambda row: creating_2(row), axis=1)

这个函数有一个限制,你只能在同一行之间进行操作。如果要减去第一行的“e1”和第二行的“f1”,则不允许使用此函数。 但是,对于您的情况,这是一个不错的选择。