为了账号安全,请及时绑定邮箱和手机立即绑定

取最小值的数据帧的名称

取最小值的数据帧的名称

茅侃侃 2022-07-19 17:08:02
我有3个数据框如下。df1 = pd.DataFrame( {"val" : [1, 11, 111, 1111, 11111, 11111],                    "val2" : [2, 22, 23, 24, 25, 26],"val3" : [33333, 33333, 3333, 333, 33, 3]} )val     val2    val31          2    3333311        22    33333111       23    33331111      24    33311111     25    3311111     26    3df2 = pd.DataFrame( {"val" : [2, 22, 23, 24, 25, 26],"val2" : [1, 11, 111, 1111, 11111, 11111],"val3" : [3, 3, 3, 3, 3, 3] } )val     val2    val32         1     322       11     323      111     324     1111     325    11111     326    11111     3&df3 = pd.DataFrame( {"val" : [33333, 33333, 3333, 333, 33, 3],"val2" : [3, 3, 3, 3333, 3, 3],"val3" : [2, 22, 23, 24, 25, 26] } )val     val2    val333333      3    233333      3    223333       3    23333     3333    2433         3    253          3    26使用代码pd.concat([df1,df2,df3]).min(level=0),我得到一个日期帧,其中包含这 3 个数据帧的每个单元格的最小值val     val2    val31         1     211        3     323        3     324       24     325        3     33         3     3现在,我的问题是有没有办法获得一个数据框,该数据框显示这些单独的值来自哪个数据框?预期输出如下val     val2    val3df1     df2     df3df1     df3     df2df2     df3     df2df2     df1     df2df2     df3     df2df3     df3     df1,df2这在 Pandas 中是否可行?
查看完整描述

3 回答

?
米脂

TA贡献1836条经验 获得超3个赞

使用numpy.ma.apple_along_axis:


def min_finder(arr1d,sep=","):

    return ",".join(["df%s" % i for i in np.argwhere(arr1d == arr1d.min()).ravel()+1])


new_df = pd.DataFrame(np.ma.apply_along_axis(min_finder, 2, np.stack(dfs, 0)).T)

print(new_df)


     0    1        2

0  df1  df2      df3

1  df1  df3      df2

2  df2  df3      df2

3  df2  df3      df3

4  df2  df3      df2

5  df3  df3  df1,df2

如果您不想打领带,请使用numpy.argmin:


dfs = [df1,df2,df3]

np.stack(dfs, 0).argmin(0)

输出:


array([[0, 1, 2],

       [0, 2, 1],

       [1, 2, 1],

       [1, 0, 1],

       [1, 2, 1],

       [2, 2, 0]])

或者让它更漂亮一点:


np.char.add("df", (np.stack(dfs, 0).argmin(0)+1).astype(str))


array([['df1', 'df2', 'df3'],

       ['df1', 'df3', 'df2'],

       ['df2', 'df3', 'df2'],

       ['df2', 'df1', 'df2'],

       ['df2', 'df3', 'df2'],

       ['df3', 'df3', 'df1']], dtype='<U23')


查看完整回答
反对 回复 2022-07-19
?
慕斯王

TA贡献1864条经验 获得超2个赞

这是一种基本方法,将值映射到其数据帧的名称,找到分钟,然后丢弃值:


(pd.concat([df1.applymap(lambda a: (a, 'df1')),

            df2.applymap(lambda a: (a, 'df2')),

            df3.applymap(lambda a: (a, 'df3'))])

   .min(level=0)

   .applymap(lambda a: a[1]))


   val val2 val3

0  df1  df2  df3

1  df1  df3  df2

2  df2  df3  df2

3  df2  df1  df2

4  df2  df3  df2

5  df3  df3  df1

请注意,将在值相等的地方返回按名称的第一个数据帧。


查看完整回答
反对 回复 2022-07-19
?
千巷猫影

TA贡献1829条经验 获得超7个赞

这是使用字典和df.isin后跟数据透视表的一种方法,可能有点冗长,因为我在测试时可能会摇摆不定,但确实可以


dict_of_dfs = {'df1':df1,'df2':df2,'df3':df3}

concated = pd.concat(dict_of_dfs.values())

a = np.vstack([np.where(v.isin(concated.min(level=0)),k,np.nan) 

              for k,v in dict_of_dfs.items()])

b = pd.DataFrame(a,columns=concated.columns,index=concated.index).replace('nan',np.nan)

print(b.head(10))


    val val2 val3

0  df1  NaN  NaN

1  df1  NaN  NaN

2  NaN  NaN  NaN

3  NaN  df1  NaN

4  NaN  NaN  NaN

5  NaN  NaN  df1

0  NaN  df2  NaN

1  NaN  NaN  df2

2  df2  NaN  df2

3  df2  NaN  df2

然后使用pivot_table(当然您可以进行自定义更改以删除额外的级别并重命名索引)


final = b.stack().reset_index()

final.pivot_table(index='level_0',columns='level_1',values=0,aggfunc=','.join)

level_1  val val2     val3

level_0                   

0        df1  df2      df3

1        df1  df3      df2

2        df2  df3      df2

3        df2  df1      df2

4        df2  df3      df2

5        df3  df3  df1,df2


查看完整回答
反对 回复 2022-07-19
  • 3 回答
  • 0 关注
  • 84 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信