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')
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
请注意,将在值相等的地方返回按名称的第一个数据帧。
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
添加回答
举报