Как я могу отфильтровать фрейм данных pandas другим фреймом данных pandas меньшего размера

#python #pandas #numpy #dataframe

#python #pandas #numpy #фрейм данных

Вопрос:

У меня есть 2 фрейма данных, первый выглядит так

df1:

     MONEY    Value
0    EUR      850
1    USD      750
2    CLP        1
3    DCN        1
  

df2:

       Money
0      USD
1      USD
2      USD
3      USD
4      EGP
...    ...
25984  USD
25985  DCN
25986  USD
25987  CLP
25988  USD
  

Я хочу удалить «Денежные» значения df2, которых нет в df1. и добавить любой столбец значений столбца «Значение» в df1

   Money    Value
0      USD      720
1      USD      720
2      USD      720
3      USD      720
...    ...
25984  USD      720
25985  DCN        1
25986  USD      720
25987  CLP        1
25000  USD      720
  

Комментарии:

1. Что-то вроде df2["Money"].map(df1.set_index("MONEY")["Value"]).dropna()

2. Это вроде как сработало. Но df2['Value'] = df2["Money"].map(df1.set_index("MONEY")["Value"]).dropna() Можете ли вы объяснить это в ответе?

Ответ №1:

Шаг за шагом:

 df1.set_index("MONEY")["Value"]
  

Этот код преобразует столбец MONEY в Dataframe индекс. Что приводит к:

     print(df1)

    MONEY
    EUR    850
    USD    150
    DCN      1
  

 df2["Money"].map(df1.set_index("MONEY")["Value"])
  

Этот код отображает содержимое df2 в df1 . Это возвращает следующее:

     0    150.0
    1      NaN
    2    850.0
    3      NaN
  

  1. Теперь мы присваиваем предыдущий столбец новому столбцу в df2 called Value . Собрать все это вместе:
 df2["Value"] = df2["Money"].map(df1.set_index("MONEY")["Value"])
  

df2 теперь выглядит так:

      Money  Value
    0   USD  150.0
    1   GBP    NaN
    2   EUR  850.0
    3   CLP    NaN
  

  1. Осталось сделать только одно: удалить все строки, которые имеют NaN значение:
 df2.dropna(inplace=True)
  

Весь пример кода:

 import pandas as pd

# Create df1
x_1 = ["EUR", 850], ["USD", 150], ["DCN", 1]
df1 = pd.DataFrame(x_1, columns=["MONEY", "Value"])

# Create d2
x_2 = "USD", "GBP", "EUR", "CLP"
df2 = pd.DataFrame(x_2, columns=["Money"])

# Create new column in df2 called 'Value'
df2["Value"] = df2["Money"].map(df1.set_index("MONEY")["Value"])
# Drops any rows that have 'NaN' in column 'Value'
df2.dropna(inplace=True)
print(df2)
  

Выводит:

 Money  Value
0   USD  150.0
2   EUR  850.0