Как узнать, изменилось ли значение по сравнению с измерениями в Пандах?
Допустим, у меня есть некоторые данные о клиентах за некоторые даты, и я хочу посмотреть, например, изменился ли их адрес. За эти даты. В идеале я хотел бы скопировать два столбца, в которых произошли изменения, в новую таблицу или просто получить показатель для суммы общих изменений.
Итак, если бы у меня был стол, как
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