Сравните столбцы двух фреймов данных и создайте новый фрейм данных - PullRequest
2 голосов
/ 25 марта 2019

У меня есть два разных фрейма данных, и я хочу сравнить несколько столбцов для каждой строки в df A

Фрейм данных A:

M_ID From To M_Type    T_Type  T_Length T_Weight #Trucks Loading_Time
1025 A    B  Boxes     Open    12-Tyre  22       3       27-March-2019 6:00PM
1029 C    D  Cylinders Trailer High     23       2       28-March-2019 6:00PM
1989 G    H  Scrap     Open    14-Tyre  25       5       26-March-2019 9:00PM

Фрейм данных B

 T_ID From To T_Type  T_Length T_Weight #Trucks  Price
6569  A    B  Open    12-Tyre  22       5        1500
8658  G    H  Open    14-Tyre  25       4        1800
4595  A    B  Open    12-Tyre  22       3        1400
1252  A    B  Trailer Low      28       5        2000
7754  C    D  Trailer High     23       4        1900
3632  G    H  Open    14-Tyre  25       10       2000
6521  C    D  Trailer High     23       8        1700
8971  C    D  Open    12-Tyre  22       8        1200
4862  G    H  Trailer High     25       15       2200

Я хочу сравнить определенные столбцы A и B, т. Е. «From, To, T_Type, T_length, T_Weight, #Trucks»

«From, To, T_Type, T_length, T_Weight» обоих кадров данных должны быть равными, ноB [#Trucks]> = A [#Trucks] и когда это условие истинно, оно должно отсортировать совпадения по цене и создать новый кадр данных с M_ID и T_ID, подобным этому

Результаты Datframe

Manufacturer   Best_match  Second_best_match 
1025           4595        6569
1029           6521        7754
1989           3632         - 

Ответы [ 2 ]

2 голосов
/ 25 марта 2019

вы можете попробовать:

dfc = pd.merge(dfa, dfb, on=['From', 'To', 'T_Type', 'T_Length', 'T_Weight'], how='inner')

dfc.drop(['From', 'To', 'M_Type', 'T_Weight', 'T_Length', 'Loading_Time', 'T_Type'], axis = 1,inplace=True)
dfc = dfc[dfc['#Trucks_y'] >= dfc['#Trucks_x']].drop(['#Trucks_y', '#Trucks_x'], axis=1)
dfc.rename(columns={"M_ID": "Manufacturer", "T_ID": "BestMatches"}, inplace=True)
dfc = dfc.groupby(['Manufacturer', 'Price'])['BestMatches'].agg('first').reset_index().drop(['Price'], axis = 1)

dfc = dfc.groupby(['Manufacturer'])['BestMatches'].agg(list).reset_index()
dfd = dfc['BestMatches'].apply(pd.Series)
dfc.drop(["BestMatches"],axis = 1,inplace = True)
dfc = dfc.join(dfd).fillna('-')

print(dfc)

выход:

   Manufacturer       0       1
0          1025  4595.0  6569.0
1          1029  6521.0  7754.0
2          1989  3632.0       -
0 голосов
/ 25 марта 2019

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

mergedStuff = pd.merge(df1, df2, on=['Name'], how='inner')
mergedStuff.head()

Я думаю, что это более эффективно и быстрее, чем where, если выиметь большой набор данных

, и если вы хотите получить различия, вы можете сделать что-то вроде этого:

Этот подход, df1 != df2, работает только для фреймов данных с одинаковыми строками и столбцами.На самом деле все оси данных сравниваются с помощью метода _indexed_same, и возникает исключение, если обнаружены различия, даже в порядке столбцов / индексов.

Если я вас правильно понял, вы не хотите находить изменения, но симметричныеразница.Для этого одним подходом может быть объединение фреймов данных:

>>> df = pd.concat([df1, df2])
>>> df = df.reset_index(drop=True)

сгруппировать по

>>> df_gpby = df.groupby(list(df.columns))

получить индекс уникальных записей

>>> idx = [x[0] for x in df_gpby.groups.values() if len(x) == 1]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...