У меня есть два dataframes
, например
import pandas as pd
import numpy as np
from random import shuffle
df_data = pd.DataFrame(data=np.random.randint(low=0, high=10, size=(10,3)), columns=['A', 'B', 'C'])
keys = np.arange(0, 10)
shuffle(keys)
df_data['keys'] = keys
key_data = pd.DataFrame(data=np.reshape(np.arange(1,10), (3,3)), columns=['Key_col1', 'Key_col2', 'Key_col3'])
key_data['Timestamp'], key_data['Info'] = ['Mon', 'Wed', 'Fri'], [13, 2, 47]
Что возвращается, что-то вроде этого:
A B C keys
0 3 9 2 5
1 7 9 4 7
2 9 6 6 0
3 9 9 0 9
4 8 5 8 6
5 2 5 7 3
6 5 1 2 4
7 3 9 6 2
8 4 2 3 8
9 6 5 5 1
и это:
Key_col1 Key_col2 Key_col3 Timestamp Info
0 1 2 3 Mon 13
1 4 5 6 Wed 2
2 7 8 9 Fri 47
Я хотел бы использовать столбец " keys
" в первом фрейме данных для поиска только столбцов Key во втором ядре данных (например, Key_col1
, Key_col2
, Key_col3
) (поскольку столбец "info" может содержать значения, которые содержат много ключей).
Затем я добавлю столбцы Timestamp
и Info
в строку, в которой есть совпадение с key
.
Ожидаемый результат для строки 0 будет следующим:
A B C keys Timestamp Info
0 3 9 2 5 Wed 2
Мой подход - это сначала подмножество моего ключа_df для значения:
key_data.iloc[:, 0:3] == 2
OUT
Key_col1 Key_col2 Key_col3
0 False True False
1 False False False
2 False False False
На следующем шаге я пытаюсь вернуть только строку, где значение True
происходит с использованием df.loc
key_data.loc[:, key_data.iloc[:, 0:3] == 2]
Но это приводит к ошибке ValueError: Cannot index with multidimensional key
Может ли кто-нибудь помочь мне вернуть строку, в которой значение True
происходит, чтобы я мог использовать этот индекс для выбора, где добавить мои данные?
Спасибо
EDIT: ключи уникальны, и все они присутствуют ровно в одном из трех ключевых столбцов.
Это работает для вас, просто переименуйте столбцы:
new_df = pd.merge(df_data, key_data, how= 'right', left_on=['keys','keys','keys'], right_on = ['Key_col1','Key_col2','Key_col3'])
new_df =new_df.dropna(axis=1, how='all')
Может ли кто-нибудь помочь мне вернуть строку, в которой значение True происходит, чтобы я мог использовать этот индекс для выбора, где добавить мои данные?
Ответ на этот вопрос - key_data.loc[(key_data.iloc[:, 0:3] == 2).any(axis=1)]
, но для вашей более крупной цели, делая что-то слияние, поскольку Рахул Агарвал предполагает, что это будет лучше.