Создайте свою собственную функцию, чтобы определить все уникальные версии в каждой группе Customer-Model.Затем используйте transform
, чтобы передать результат обратно в каждую строку этой группы.
Пример данных
import pandas as pd
import numpy as np
df = pd.DataFrame({'Customer': ['Cust1']*3+['Cust2']*3,
'Model': ['A1']*3 + ['A2', 'A1', 'A2'],
'Version1': ['1, 2', '3', np.NaN, '1', '2', np.NaN],
'Version2': ['5', '6', np.NaN, '3', np.NaN, '4']})
Код:
def my_join(x):
x = x.dropna()
if x.empty:
return np.NaN
else:
return ', '.join(np.unique(x.str.split(',\s?').sum()))
gp = df.groupby(['Customer', 'Model'])
for col in ['Version1', 'Version2']:
df[col] = gp[col].transform(my_join)
Вывод:
Customer Model Version1 Version2
0 Cust1 A1 1, 2, 3 5, 6
1 Cust1 A1 1, 2, 3 5, 6
2 Cust1 A1 1, 2, 3 5, 6
3 Cust2 A2 1 3, 4
4 Cust2 A1 2 NaN
5 Cust2 A2 1 3, 4
Это будет учитывать случаи, когда значения повторяются в пределахдругие поля: '1, 2'
и '1, 3'
в версии 1 будут по-прежнему возвращать '1, 2, 3'
в качестве выходных данных:
Похоже, что у .transform(str.join)
возникают проблемы при наличии нулевых ключей группировки.Таким образом, мы можем замаскировать их первыми, чтобы исправить ValueError
:
m = df[['Customer', 'Model']].notnull().all(1)
gp = df[m].groupby(['Customer', 'Model'])
for col in ['Version1', 'Version2']:
df.loc[m, col] = gp[col].transform(my_join)