[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즉시 중 하나에 일치 할 수 없습니다, 그래서 b2b4.

가장 좋은 방법은 무엇입니까?



답변

사용하는 방법은 다음과 같습니다 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'}


답변