【问题标题】:Subtract pandas dataframes while leaving some columns intact减去 pandas 数据帧,同时保留一些列完整
【发布时间】:2016-07-04 19:40:30
【问题描述】:

假设我有两个数据框:

data1 = """
idx, stat, val
1, 1, 5
2, 1, 10
3, 2, 15
4, 3, 20
"""
data2 = """
idx, stat, val
2, 1, 8
4, 5, 16
"""

(抱歉 - 我不知道如何在 pandas 中轻松编写代码 - 我会在现实生活中从 csv 中读取它们)。

我想减去这两个数据帧,以便只减去 val 列(在现实生活中,这些是站坐标)。如果两个数据帧中只有一个具有各自的索引值(ascii 格式的列 idx),则结果应该是 NaN。如果立即删除不匹配的行也可以(无论如何我都会调用 dropna)。

因此,我想要的结果是:

desired = """
idx, stat, val
1, 1, NaN
2, 1, 2
3, 2, NaN
4, 3, 4
"""

原则上data1.sub(data2) 工作得很好——除了我看不到如何“保护” stat 列不被减法。我也试过data1.sub(data2['val'], axis=0),但这搞砸了data1.sub(data2)中自动执行的行匹配。一种解决方法是之后用来自data1 的原始值重新替换 stat 列,但这似乎相当笨拙。

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    你可以使用:

    df1.set_index(['idx','stat'], inplace=True)
    df2.set_index('idx', inplace=True)
    
    print (df1.sub(df2[['val']]))
              val
    idx stat     
    1   1     NaN
    2   1     2.0
    3   2     NaN
    4   3     4.0
    
    print (df1.sub(df2[['val']]).reset_index())
       idx  stat  val
    0    1     1  NaN
    1    2     1  2.0
    2    3     2  NaN
    3    4     3  4.0
    

    如果idx 是两个df 中的索引:

    print (df1)
         stat  val
    idx           
    1       1    5
    2       1   10
    3       2   15
    4       3   20
    
    print (df2)
         stat  val
    idx           
    2       1    8
    4       5   16
    
    df1.set_index('stat', append=True, inplace=True)
    print (df1.sub(df2[['val']]).reset_index())
       idx  stat  val
    0    1     1  NaN
    1    2     1  2.0
    2    3     2  NaN
    3    4     3  4.0
    

    【讨论】:

      猜你喜欢
      • 2018-11-12
      • 2017-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多