Пример фрейма данных:

    A           B
0   2.234560    0.842407
1   0.842407    2.234560
2   3.183770    1.200300
3   1.200300    3.18377

Я пытаюсь добавить новый столбец о сопоставлении значений из столбцов «A» и «B»

Как это:

    A           B           C
0   2.234560    0.842407    A0 Matching with B1
1   0.842407    2.234560    B1 Matching with A0 
2   3.183770    1.200300    A2 Matching with B3
3   1.200300    3.183770    B3 Matching with A2 

Какое правильное решение?

0
rusfic digital 14 Фев 2021 в 12:44

2 ответа

Лучший ответ

Предполагая, что все значения из A встречаются в B только в другом порядке, вы можете легко использовать dict для поиска позиции:

import pandas as pd

df = pd.DataFrame.from_dict({
    'A': [2.234560, 0.842407, 3.183770, 1.200300], 
    'B': [0.842407, 2.234560, 1.200300, 3.183770]
})

# to account for gaps/duplicates in the index
lookup = dict(zip(df['B'], df.index))
df['C'] = [f'A{i} matches B{lookup[a]}' for a, i in zip(df['A'], df.index)]
print(df)

Выход:

          A         B              C
0  2.234560  0.842407  A0 matches B1
1  0.842407  2.234560  A1 matches B0
2  3.183770  1.200300  A2 matches B3
3  1.200300  3.183770  A3 matches B2
1
Stefan B 14 Фев 2021 в 11:45

Некоторые шаги можно улучшить, но они должны работать:

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.rand(4,1), columns=['A'])
df['B'] = df['A'].sample(frac=1).reset_index(drop=True)


df_temp_a = df[['A']].assign(col_string_a = lambda x: 'A'+x.index.astype('str')).set_index('A')
df_temp_b = df[['B']].assign(col_string_b = lambda x: 'B'+x.index.astype('str')).set_index('B')

merged = df_temp_a.join(df_temp_b, how='inner')
merged['final_col'] = merged['col_string_a'] + " Matching with " + merged['col_string_b']
merged

df.merge(merged[['final_col']], how='left', left_on=['A'], right_index=True)
1
SultanOrazbayev 14 Фев 2021 в 11:31
66194147