найти разницу между любыми двумя столбцами данных с общим ключом столбцов панд - PullRequest
0 голосов
/ 06 июня 2018

У меня есть два кадра данных, один из которых имеет

Title  Name Quantity ID

в качестве столбцов

, а второй кадр данных имеет

ID Quantity

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

Мне нужно найти разницу между количеством обоих фреймов данных на основе совпадения в столбцах идентификаторов, и я хочу сохранить эту разницу в отдельном столбце в первом фрейме данных.

Я попробовал это (не сработало):

DF1[['ID','Quantity']].reset_index(drop=True).apply(lambda id_qty_tup  : DF2[DF2.ID==asin_qty_tup[0]].quantity - id_qty_tup[1] , axis = 1)

Другой подход заключается в применении идентификатора и количества DF1 и итерации по каждой строке DF2, ноэто занимает больше времени.Я уверен, что есть лучший способ.

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

Вы можете использовать map в этом случае:

df['diff'] = df['ID'].map(df2.set_index('ID').Quantity) - df.Quantity

Некоторые данные

import pandas as pd
df = pd.DataFrame({'Title': ['A', 'B', 'C', 'D', 'E'],
                   'Name': ['AA', 'BB', 'CC', 'DD', 'EE'],
                   'Quantity': [1, 21, 14, 15, 611],
                   'ID': ['A1', 'A1', 'B2', 'B2', 'C1']})

df2 = pd.DataFrame({'Quantity': [11, 51, 44],
                    'ID': ['A1', 'B2', 'C1']})

Мы будем использовать df2 для создания словаря, который можно использоватьсопоставить ID с Quantity.Таким образом, везде, где есть ID==A1 в df, ему присваивается количество 11, B2 - 51, а C1 - 44. Здесь «я добавлю его в качестве другого столбца только для иллюстрации.

df['Quantity2'] = df['ID'].map(df2.set_index('ID').Quantity)
print(df)

   ID Name  Quantity Title  Quantity2
0  A1   AA         1     A         11
1  A1   BB        21     B         11
2  B2   CC        14     C         51
3  B2   DD        15     D         51
4  C1   EE       611     E         44
Name: ID, dtype: int64

Тогда вы можете просто вычесть df['Quantity'] и столбец, который мы только что создали, чтобы получить разницу.(Или вычтите это из df['Quantity'], если вы хотите другую разницу)

0 голосов
/ 06 июня 2018

Вы можете выполнить вычитание по индексу, а панды позаботятся обо всем остальном.

df['Diff'] = df.set_index('ID').Quantity.sub(df2.set_index('ID').Quantity).values

Демо
Здесь changetype - это индекс, а яВы уже установили его, поэтому pd.Series.sub выровняет вычитание по умолчанию.В противном случае вам нужно будет установить индекс, как указано выше.

df1
                      strings      test
changetype                             
0                     a very  -1.250150
1            very boring text -1.376637
2            I cannot read it -1.011108
3                 Hi everyone -0.527900
4             please go home  -1.010845
5               or I will go   0.008159
6                         now -0.470354

df2
                                     strings      test
changetype                                            
0                    a very very boring text  0.625465
1                           I cannot read it -1.487183
2                                Hi everyone  0.292866
3            please go home or I will go now  1.430081

df1.test.sub(df2.test)

changetype
0   -1.875614
1    0.110546
2   -1.303974
3   -1.957981
4         NaN
5         NaN
6         NaN
Name: test, dtype: float64
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...