[python] 팬더 데이터 프레임의 데이터를 사용하여 열을 일치시킵니다.
나는 두가 pandas
데이터 프레임을, a
그리고 b
:
a1 a2 a3 a4 a5 a6 a7
1 3 4 5 3 4 5
0 2 0 3 0 2 1
2 5 6 5 2 1 2
과
b1 b2 b3 b4 b5 b6 b7
3 5 4 5 1 4 3
0 1 2 3 0 0 2
2 2 1 5 2 6 5
두 데이터 프레임에는 정확히 동일한 데이터가 포함되지만 순서가 다르고 열 이름이 다릅니다. 두 개의 데이터 프레임의 숫자를 바탕으로, 나는 각 열 이름과 일치 할 수 있도록하고 싶습니다 a
의 각 열 이름 b
.
그것은 쉽게 단순히의 첫 번째 행을 비교하지 않습니다 a
의 첫 번째 행에 b
예 모두에 대해, 값이 중복으로 a4
하고 a7
값이 5
즉시 중 하나에 일치 할 수 없습니다, 그래서 b2
나 b4
.
가장 좋은 방법은 무엇입니까?
답변
사용하는 방법은 다음과 같습니다 sort_values
.
m=df1.T.sort_values(by=[*df1.index]).index
n=df2.T.sort_values(by=[*df2.index]).index
d=dict(zip(m,n))
print(d)
{'a1': 'b5', 'a5': 'b1', 'a2': 'b7', 'a3': 'b6', 'a6': 'b3', 'a7': 'b2', 'a4': 'b4'}
답변
numpy를 활용하는 한 가지 방법이 있습니다 broadcasting
.
b_cols = b.columns[(a.values == b.T.values[...,None]).all(1).argmax(1)]
dict(zip(a, b_cols))
{'a1': 'b5',
'a2': 'b7',
'a3': 'b6',
'a4': 'b4',
'a5': 'b1',
'a6': 'b3',
'a7': 'b2'}
@piR에 의한 또 다른 비슷한 접근법 :
a_ = a.to_numpy()
b_ = b.to_numpy()
i, j = np.where((a_[:, None, :] == b_[:, :, None]).all(axis=0))
dict(zip(a.columns[j], b.columns[i]))
{'a1': 'b5',
'a2': 'b7',
'a3': 'b6',
'a4': 'b4',
'a5': 'b1',
'a6': 'b3',
'a7': 'b2'}
답변
한 가지 방법 merge
s=df1.T.reset_index().merge(df2.T.assign(match=lambda x : x.index))
dict(zip(s['index'],s['match']))
{'a1': 'b5', 'a2': 'b7', 'a3': 'b6', 'a4': 'b4', 'a5': 'b1', 'a6': 'b3', 'a7': 'b2'}
답변
사전 이해
tuple
사전에서 해시 키로 열 값 중 하나 를 사용하십시오.
d = {(*t,): c for c, t in df2.items()}
{c: d[(*t,)] for c, t in df1.items()}
{'a1': 'b5',
'a2': 'b7',
'a3': 'b6',
'a4': 'b4',
'a5': 'b1',
'a6': 'b3',
'a7': 'b2'}
완벽한 표현이없는 경우를 대비하여 일치하는 열의 사전 만 만들었습니다.
d2 = {(*t,): c for c, t in df2.items()}
d1 = {(*t,): c for c, t in df1.items()}
{d1[c]: d2[c] for c in {*d1} & {*d2}}
{'a5': 'b1',
'a2': 'b7',
'a7': 'b2',
'a6': 'b3',
'a3': 'b6',
'a1': 'b5',
'a4': 'b4'}
idxmax
이 터무니없는 테두리 … 실제로하지 마십시오.
{c: df2.T.eq(df1[c]).sum(1).idxmax() for c in df1}
{'a1': 'b5',
'a2': 'b7',
'a3': 'b6',
'a4': 'b4',
'a5': 'b1',
'a6': 'b3',
'a7': 'b2'}