Как узнать, изменилось ли значение по сравнению с измерениями в Пандах?

Допустим, у меня есть некоторые данные о клиентах за некоторые даты, и я хочу посмотреть, например, изменился ли их адрес. За эти даты. В идеале я хотел бы скопировать два столбца, в которых произошли изменения, в новую таблицу или просто получить показатель для суммы общих изменений.

Итак, если бы у меня был стол, как

Date , Customer , Address
12/31/14, Cust1, 12 Rocky Hill Rd
12/31/15, Cust1, 12 Rocky Hill Rd
12/31/16, Cust1, 14 Rocky Hill Rd
12/31/14, Cust2, 12 Testing Rd
12/31/15, Cust2, 12 Testing Ln
12/31/16, Cust2, 12 Testing Rd

Я бы закончил с подсчетом двух изменений: изменение Клиента 1 между 12 Rocky Hill Rd между 31.12.15 и 31.12.16 и изменение Cust2 между 31.12.14 и 31.12.15.

В идеале я мог бы получить такой стол

Dates , Customer , Change
12/31/15 to 12/31/16, Cust1, 12 Rocky Hill Rd to 14 Rocky Hill Rd
12/31/14 to 12/31/15, Cust2, 12 Testing Rd to 12 Testing Ln

Или даже просто общее количество изменений было бы здорово. Есть идеи? В идеале, у меня было бы больше дат, возможно несколько изменений за эти даты, и, возможно, дополнительные столбцы, в которых я хотел бы также проверить изменения. Действительно, для каждого столбца будет достаточно просто суммировать изменения в записи клиента за определенный период времени.

Я новичок в Panda и не совсем уверен, с чего начать.

Редактировать: Как я отмечаю в приведенном ниже решении, я хотел бы иметь возможность передавать больший массив данных с не просто адресом, чтобы обнаруживать изменения. Например, я выполнил это в R с помощью чего-то вроде следующего: `введите код здесь

`#How many changes have occured (unique values - 1)
UniLen <-  function(x){
  x <- length(unique(x))-1
  return(x)
}
#Create a vector of Address Features to check for changes in
Address_Features <- c("AddrLine1", "AddrLine2", "AddrLine3", "CityName", "State", "ZipCodeNum", "County")
#Check for changes in each address 'use this address for description' for each customer
AddressChanges_Detail <- mktData[,c("CustomerNumEID","AddressUniqueRelationDesc",Address_Features)] %>%
  group_by(CustomerNumEID, AddressUniqueRelationDesc) %>%
  summarise_each(funs(UniLen))

#Summarise results (how many changes for each feature)
AddressChanges_Summary <- AddressChanges_Detail[,Address_Features] %>%
  summarise_each(funs(sum))

Это позволяет нам подсчитать, сколько изменений произошло, но я упускаю дату, когда произошло изменение, и то, с чего функция была изменена и на... Кажется, решение Python, которое вы предложили, решает для этого с использованием.shift вместо просто сводки уникальных значений в некоторой группе. В идеале я хотел бы лучшего из обоих миров:).

1 ответ

Решение
df

Входной фрейм данных

    Date    Customer    Address
0   12/31/14    Cust1   12 Rocky Hill Rd
1   12/31/15    Cust1   12 Rocky Hill Rd
2   12/31/16    Cust1   14 Rocky Hill Rd
3   12/31/14    Cust2   12 Testing Rd
4   12/31/15    Cust2   12 Testing Ln
5   12/31/16    Cust2   12 Testing Rd

Функция изменения адреса:

def changeAdd(x):
    x=x[x.Address != x.shift(-1).Address]
    df1 = pd.DataFrame({'Date':x.shift(1).Date + ' to '+ x.Date,
              'Customer':x.Customer.max(),
              'Address':x.shift(1).Address +' to ' + x.Address})
    return df1[df1.Address.notnull()]


dm = df.groupby('Customer')\
   .apply(changeAdd)\
   .reset_index(drop=True)[['Date','Customer','Address']]

dm

Выходной фрейм данных:

Date    Customer    Address
0   12/31/15 to 12/31/16    Cust1   12 Rocky Hill Rd to 14 Rocky Hill Rd
1   12/31/14 to 12/31/15    Cust2   12 Testing Rd to 12 Testing Ln
2   12/31/15 to 12/31/16    Cust2   12 Testing Ln to 12 Testing Rd
Другие вопросы по тегам