【问题标题】:Pandas Compare Similar DataFrames and get MinPandas 比较相似的 DataFrame 并获得 Min
【发布时间】:2017-09-08 15:03:43
【问题描述】:

给定以下数据框:

d1=pd.DataFrame({'A':[1,2,np.nan],'B':[np.nan,5,6]})
d1.index=['A','B','E']

    A       B
A   1.0     NaN
B   2.0     5.0
E   NaN     6.0

d2=pd.DataFrame({'A':[4,2,np.nan,4],'B':[4,2,np.nan,4]})
d2.index=['A','B','C','D']
    A       B
A   4.0     4.0
B   2.0     2.0
C   NaN     NaN
D   4.0     4.0

我想比较它们以找到每个对应行中的最小值,同时保留两者的所有行索引。 这是我正在寻找的结果:

    A       B
A   1.0     4.0
B   2.0     2.0
C   NaN     NaN
D   4.0     4.0
E   NaN     6.0

提前致谢!

【问题讨论】:

    标签: python pandas dataframe compare min


    【解决方案1】:

    您可以连接 dfs,然后使用 groupby 保持最小

    df = pd.concat([d1,d2])
    df = df.groupby(df.index).min()
    

    你得到

        A   B
    A   1.0 4.0
    B   2.0 2.0
    C   NaN NaN
    D   4.0 4.0
    E   NaN 6.0
    

    编辑:@root 和 @ScottBoston 提供的更简洁的解决方案

    pd.concat([d1, d2]).groupby(level=0).min()
    

    【讨论】:

    • 或 df = df.groupby(df.index).min()
    • 或单行pd.concat([d1, d2]).groupby(level=0).min()
    【解决方案2】:

    aligning 的另一个选项首先使用两个数据框(索引和列),然后使用numpy.fmin

    pd.np.fmin(*d1.align(d2))
    

    不那么复杂:

    d1, d2 = d1.align(d2)
    pd.np.fmin(d1, d2)
    

    【讨论】:

    • 我喜欢这个!但是你知道你只是在我的工具箱里放了另一个工具:-)
    【解决方案3】:

    pd.Panelmin 一起使用
    另请注意,这可推广到任意数量的数据帧。

    pd.Panel(dict(enumerate([d1, d2]))).min(0)
    
         A    B
    A  1.0  4.0
    B  2.0  2.0
    C  NaN  NaN
    D  4.0  4.0
    E  NaN  6.0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-11
      • 1970-01-01
      • 1970-01-01
      • 2019-08-08
      • 1970-01-01
      • 1970-01-01
      • 2021-02-04
      • 2018-10-01
      相关资源
      最近更新 更多