#python #pandas
#python #pandas
Вопрос:
В DataFrame df сгруппируйте, используя несколько столбцов, и для каждой группы найдите элементы третьего столбца, создайте отсортированный список этих элементов и прикрепите его к исходному фрейму данных.
Приведенный пример
df = pd.DataFrame({'c':[1,1,2,2,3,3],'l1':['a','a','a','a','b','b'],'l3':['b','a','b','a','a','a'],'l4':[1,2,3,4,5,6]})
df
c l1 l3 l4
0. 1 a b 1
1. 1 a a 2
2. 2 a b 3
3. 2 a a 4
4. 3 b a 5
5. 3 b a 6
Пробовал,
def makePair(l3):
#print(type(k))
k=l3.sort_values()
k=k.to_list()
print(k) # Prints correctly BA , BA
return k
df['pair'] = df.groupby(['c','l1'])['l3'].transform(makePair).copy()
df
Вывод
- [‘a’, ‘b’]
- [‘a’, ‘b’]
- [‘a’, ‘a’]
.. Пока все идет хорошо, но результат df
. c l1 l3 l4 pair
0 1 a b 1 a
1 1 a a 2 b
2 2 a b 3 a
3 2 a a 4 b
4 3 b a 5 a
5 3 b a 6 a
Ожидайте
df.pair = [ ['a', 'b'], ['a', 'b'], ['a', 'b'], ['a', 'b'], ['a', 'a'], ['a', 'a'] ]
Ответ №1:
Используя вашу функцию, вы можете использовать:
cols = ['c','l1']
out = (df.set_index(cols).assign(pair=df.groupby(cols)['l3']
.agg(makePair)).reset_index()
.reindex(df.columns.union(['pair'],sort=False),axis=1))
Полный код:
def makePair(l3):
k=l3.sort_values()
k=k.to_list()
return k
cols = ['c','l1']
out = (df.set_index(cols).assign(pair=df.groupby(cols)['l3']
.agg(makePair)).reset_index()
.reindex(df.columns.union(['pair'],sort=False),axis=1))
print(out)
Еще вы также можете сделать:
cols = ['c','l1']
out = (df.set_index(cols).assign(pair=
df.sort_values(cols ['l3']).groupby(cols)['l3'].agg(list)).reset_index())
print(out)
c l1 l3 l4 pair
0 1 a b 1 [a, b]
1 1 a a 2 [a, b]
2 2 a b 3 [a, b]
3 2 a a 4 [a, b]
4 3 b a 5 [a, a]
5 3 b a 6 [a, a]
Комментарии:
1. спасибо, но что, если сортировка является пользовательской функцией, как вы использовали .agg(список)
2. @VZG я также опубликовал метод, использующий вашу функцию on. Я правильно вас понял?
3. Также интересно узнать, почему @VZG получил неверные результаты
4. @user2458922 поскольку они использовали
transform
, а неagg
так, кортеж разбивается на строки