У меня есть два фрейма данных с одинаковыми типами столбцов.

Первый фрейм данных (df1)

data = [['BTC', 2], ['ETH', 1], ['ADA', 100]]
df1 = pd.DataFrame(data, columns=['Coin', 'Quantity'])
Coin     Quantity
BTC          2
ETH          1
ADA        100
...        ...

Второй фрейм данных (df2)

data = [['BTC', 50000], ['FTM', 50], ['ETH', 1500], ['LRC', 5], ['ADA', 20]]
df2 = pd.DataFrame(data, columns=['code_name', 'selling rate'])
code_name     selling rate
BTC               50000
FTM                  50
ETH                1500
LRC                   5
ADA                  20
...                 ...

Ожидаемый результат (FTM и LRC следует удалить)

Coin     Quantity     selling rate
BTC          2           50000
ETH          1            1500
ADA        100              20
...        ...             ...

Что я пробовал

df1.merge(df2, how='outer', left_on=['Coin'], right_on=['code_name'])
df = np.where(df1['Coin'] == df2['code_name'])

Оба кода не дали мне ожидаемого результата. Я искал в StackOverflow и не нашел полезного ответа. Может ли кто-нибудь дать решение или сделать этот вопрос дублирующим, если существует связанный вопрос?

3
Kalana 9 Апр 2021 в 09:51

2 ответа

Лучший ответ

Оба кода не дали мне ожидаемого результата. Я искал в StackOverflow и не нашел полезного ответа. Может ли кто-нибудь дать решение или сделать этот вопрос дублирующим, если существует связанный вопрос?

import pandas as pd

# Make the first data frame
df1 = pd.DataFrame({
    'Coin': ['BTC', 'ETH', 'ADA'],
    'Quantity': [2, 1, 100]
})

# Make the second data frame
df2 = pd.DataFrame({
    'code_name': ['BTC', 'FTM', 'ETH', 'LRC', 'ADA'],
    'selling_rate': [50000, 50, 1500, 5, 20]
})

# Merge the data frames via inner join. This only keeps entries that appear in
# both data frames
full_df = df1.merge(df2, how = 'inner', left_on = 'Coin', right_on = 'code_name')

# Drop the duplicate column
full_df = full_df.drop('code_name', axis = 1)
3
rossdrucker9 9 Апр 2021 в 07:06

Поскольку merge() медленный для большого набора данных. Я предпочитаю не использовать его, пока у меня есть более быстрое решение. Поэтому предлагаю следующее:

full_df = df1.copy()
full_df['selling_rate'] = list(
    df2['selling_rate'][df2['code_name'].isin(df1['Coin'].unique())])

Примечание. Это превращается в ожидаемое решение, если df1 и df2 находятся в одном порядке относительно Coin и code_name. Если это не так, вы должны использовать sort_values() перед приведенным выше кодом.

1
Maryam Bahrami 9 Апр 2021 в 07:52