我有 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/