moys:
私は以下のように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つのデータフレームの各セルの最小値を持つdateframeを取得します
val val2 val3
1 1 2
11 3 3
23 3 3
24 24 3
25 3 3
3 3 3
さて、私の質問は、そこからから来ているこれらの個々の値をDATAFRAME番組データフレームを取得する方法はありますか?アウトプット予想は以下の通りです
val val2 val3
df1 df2 df3
df1 df3 df2
df2 df3 df2
df2 df1 df2
df2 df3 df2
df3 df3 df1,df2
これはパンダでさえ可能ですか?
クリス:
使い方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')