python - 从中获取最小值的数据帧的名称

标签 python pandas dataframe

我有 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    val3
1          2    33333
11        22    33333
111       23    3333
1111      24    333
11111     25    33
11111     26    3
df2 = 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    val3
2         1     3
22       11     3
23      111     3
24     1111     3
25    11111     3
26    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    val3
33333      3    2
33333      3    22
3333       3    23
333     3333    24
33         3    25
3          3    26

用代码pd.concat([df1,df2,df3]).min(level=0) ,我得到一个日期框,它具有这 3 个数据框的每个单元格的最小值
val     val2    val3
1         1     2
11        3     3
23        3     3
24       24     3
25        3     3
3         3     3

现在,我的问题是有没有办法获得一个数据框,该数据框显示这些单个值来自哪个数据框?预期输出如下
val     val2    val3
df1     df2     df3
df1     df3     df2
df2     df3     df2
df2     df1     df2
df2     df3     df2
df3     df3     df1,df2

这在 Pandas 中甚至可能吗?

最佳答案

这是使用字典和 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

关于python - 从中获取最小值的数据帧的名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60087855/

相关文章:

python - 如何在 python 中为电子邮件创建消息 ID?

python - 使用 dropna() 选择子集以选择多列

Python - 有序 header HTTP 请求

python - 从 Pandas 组中获取最新值(value)

python - 在一个巨大的 Panda DataFrame 中将几列放在前面

python - 按日期过滤 Pandas DataFrame

python - 为什么我不能从一个列表理解中得到两个列表?

python - 从 pandas 多索引数据框中删除所有 NaN 值的项目

python - 如何将绝对值合并到 Pandas 数据框中?

python - withColumn 与 UDF 产生 AttributeError : 'NoneType' object has no attribute '_jvm'