3 回答
TA貢獻(xiàn)1836條經(jīng)驗(yàn) 獲得超3個(gè)贊
使用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
如果您不想打領(lǐng)帶,請使用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]])
或者讓它更漂亮一點(diǎn):
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貢獻(xiàn)1864條經(jīng)驗(yàn) 獲得超2個(gè)贊
這是一種基本方法,將值映射到其數(shù)據(jù)幀的名稱,找到分鐘,然后丟棄值:
(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
請注意,將在值相等的地方返回按名稱的第一個(gè)數(shù)據(jù)幀。
TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超7個(gè)贊
這是使用字典和df.isin后跟數(shù)據(jù)透視表的一種方法,可能有點(diǎn)冗長,因?yàn)槲以跍y試時(shí)可能會搖擺不定,但確實(shí)可以
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(當(dāng)然您可以進(jìn)行自定義更改以刪除額外的級別并重命名索引)
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
添加回答
舉報(bào)
