【问题标题】:How to subtract one dataframe from another?如何从另一个数据帧中减去一个数据帧?
【发布时间】:2016-12-31 05:54:03
【问题描述】:

首先,让我来设置舞台。

我从 pandas 数据帧 klmn 开始,看起来像这样:

In [15]: klmn
Out[15]: 
    K  L         M   N
0   0  a -1.374201  35
1   0  b  1.415697  29
2   0  a  0.233841  18
3   0  b  1.550599  30
4   0  a -0.178370  63
5   0  b -1.235956  42
6   0  a  0.088046   2
7   0  b  0.074238  84
8   1  a  0.469924  44
9   1  b  1.231064  68
10  2  a -0.979462  73
11  2  b  0.322454  97

接下来我根据“K”列中的值将klmn分成两个数据框klmn0klmn1

In [16]: k0 = klmn.groupby(klmn['K'] == 0)
In [17]: klmn0, klmn1 = [klmn.ix[k0.indices[tf]] for tf in (True, False)]
In [18]: klmn0, klmn1
Out[18]: 
(   K  L         M   N
0  0  a -1.374201  35
1  0  b  1.415697  29
2  0  a  0.233841  18
3  0  b  1.550599  30
4  0  a -0.178370  63
5  0  b -1.235956  42
6  0  a  0.088046   2
7  0  b  0.074238  84,
     K  L         M   N
8   1  a  0.469924  44
9   1  b  1.231064  68
10  2  a -0.979462  73
11  2  b  0.322454  97)

最后,我计算klmn0M 列的平均值,按L 列中的值分组:

In [19]: m0 = klmn0.groupby('L')['M'].mean(); m0
Out[19]: 
L
a   -0.307671
b    0.451144
Name: M

现在,我的问题是,如何从 klmn1 子数据框的 M 列中减去 m0,同时尊重 L 列中的值?(我的意思是m0['a']被从klmn1中每一行的M列中减去,L列中有'a'm0['b']也是如此。)

可以想象这样做的方式是将klmn1M 列中的值替换为新值(在从m0 中减去该值之后)。或者,可以想象以一种保持klmn1 不变的方式执行此操作,而是生成一个新的数据框klmn11,并更新M 列。 我对这两种方法都感兴趣。

【问题讨论】:

  • 顺便说一句,我对用于将klmn 拆分为klmn0klmn1 的代码不满意。具体来说,诉诸于对(True, False) 进行迭代的理解来获取两个子数据帧似乎很麻烦。是否有一些索引表达式klmn[...]klmn.ix[...] 直接使用groupby 对象k0 来提取子数据帧?

标签: pandas


【解决方案1】:

如果您将 klmn1 数据框的索引重置为 L 列的索引,那么您的数据框将自动将索引与您从中减去的任何系列对齐:

In [1]: klmn1.set_index('L')['M'] - m0
Out[1]:
L
a    0.777595
a   -0.671791
b    0.779920
b   -0.128690
Name: M

【讨论】:

    【解决方案2】:

    选项#1:

    df1.subtract(df2, fill_value=0) 
    

    选项 #2:

    df1.subtract(df2, fill_value=None) 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-21
      • 2022-10-12
      相关资源
      最近更新 更多