Слияние "один-к-одному" файловому кадру в пандах

Вопрос:

У меня есть два кадра данных:

df1 = pd.DataFrame(data =
{'Invoice' : [1, 2, 3, 4, 5], 'Value' : [10, 25, 40, 10, 15]})
df2 = pd.DataFrame(data =
{'Invoice' : [2, 3, 5, 2], 'Value' : [25, 11, 15,25], 'TestData':["A",'B','C','D']})

Я уже объединил их и получаю df3:

df3=pd.merge(df1,df2, left_on=["Invoice","Value"], right_on=["Invoice","Value"])

Выход Df3:

   Invoice    Value   TestData
0      2    25        A
1      2    25        D
2      5    15        C

Мой вопрос заключается в том, как получить объединенный фрейм с «один-к-одному» (я имею в виду — когда номер счета-фактуры 2 встречается только один раз (или вообще меньше) в одном из двух фреймов данных, то не создавайте еще одну строку с номером счета-фактуры 2 в объединенный фрейм данных). Я хотел бы получить что-то вроде этого:

   Invoice    Value   TestData
0      2    25        A
1      5    15        C

или это:

   Invoice    Value   TestData
0      2    25        D
1      5    15        C

Я пробовал только слияние слева и справа, но это не работает — всегда есть две строки с номером счета 2.

Спасибо,
Ярек

Лучший ответ:

Используйте drop_duplicates с указанием имен столбцов, параметр keep='last' для последней дублированной строки:

df2 = df2.drop_duplicates(["Invoice","Value"])
#same as
#df2 = df2.drop_duplicates(["Invoice","Value"], keep='first')
df3=pd.merge(df1,df2, on=["Invoice","Value"])
print (df3)
   Invoice  Value TestData
0        2     25        A
1        5     15        C

df2 = df2.drop_duplicates(["Invoice","Value"], keep='last')
df3=pd.merge(df1,df2, on=["Invoice","Value"])
print (df3)
   Invoice  Value TestData
0        2     25        D
1        5     15        C

РЕДАКТИРОВАТЬ:

Если нужна группа по всем строкам, необходимо добавить новый столбец для уникальности:

df1['g'] = df1.groupby(['Invoice','Value']).cumcount()
df2['g'] = df2.groupby(['Invoice','Value']).cumcount()

print (df1)
   Invoice  Value  g
0        1     10  0
1        2     25  0
2        3     40  0
3        4     10  0
4        5     15  0

print (df2)
   Invoice TestData  Value  g
0        2        A     25  0
1        3        B     11  0
2        5        C     15  0
3        2        D     25  1

df3=pd.merge(df1,df2, on=["Invoice","Value", "g"]).drop('g', axis=1)
print (df3)
   Invoice  Value TestData
0        2     25        A
1        5     15        C

Ответ №1

Вы можете попробовать метод дедупликации по определенным столбцам:

df3.drop_duplicates(subset="Invoice")

Invoice  Value TestData
0        2     25        A
2        5     15        C

Чтобы получить больше информации:

https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.drop_duplicates.html

Оцените статью
TechArks.Ru
Добавить комментарий