Как объединить ';'. Join и lambda x: x.tolist () внутри функции groupby.agg ()? - PullRequest
2 голосов
/ 01 октября 2019

Обновление ниже!

Я пытаюсь объединить и отсортировать список идентификаторов и связанных с ними уникальных Name_ID, разделенных точками с запятой. Например:

Name_ID Adress_ID            Name_ID Adress_ID
Name1   5875383              Name1   5875383; 5901847
Name1   5901847              Name2   5285200
Name2   5285200      to      Name3   2342345; 6463736
Name3   2342345
Name3   6463736

Это мой текущий код:

origin_file_path = Path("Folder/table.xlsx")
dest_file_path = Path("Folder/table_sorted.xlsx")

table = pd.read_excel(origin_file_path)
df1 = pd.DataFrame(table)

df1 = df1.groupby('Name_ID').agg(lambda x: x.tolist())

df1.to_excel(dest_file_path, sheet_name="Adress_IDs")

Но он экспортирует его в файл Excel следующим образом:

Name_ID Adress_ID
Name1   [5875383, 5901847]

Может кто-нибудь сказатьмне, что лучше всего было бы избавиться от формата списка и разделить точкой с запятой вместо запятой?

Обновление:

Пользователь Jezrael связал меня это тема . Но я не могу объединить ';'.join с lambda x: x.tolist().

df1 = df1.groupby('Kartenname').agg(';'.join, lambda x: x.tolist())

Производит TypeError: join () принимает ровно один аргумент (2 дано)

df1 = df1.groupby('Kartenname').agg(lambda x: x.tolist(), ';'.join)

Производит TypeError: () принимает 1 позиционный аргумент, но было дано 2.

Я также пробовал другие комбинации, но ни одна из них, кажется, даже не работает должным образом. Избавиться от лямбда-функции не вариант, потому что тогда она просто вставляет Name_ID Adress_ID тысячу раз вместо правильного Name и правильных идентификаторов.

Ответы [ 3 ]

2 голосов
/ 01 октября 2019

Вы можете передать agg кортежи функций с новыми именами столбцов с агрегатными функциями:

df['Adress_ID'] = df['Adress_ID'].astype(str)
df1 = df.groupby('Name_ID')['Adress_ID'].agg([('a', ';'.join),
                                              ('b',  lambda x: x.tolist())])

print (df1)
                       a                   b
Name_ID                                     
Name1    5875383;5901847  [5875383, 5901847]
Name2            5285200           [5285200]
Name3    2342345;6463736  [2342345, 6463736]

Если передать только агрегатные функции в списке (без кортежей), получите имена столбцов по умолчанию:

df2 = df.groupby('Name_ID')['Adress_ID'].agg([ ';'.join,lambda x: x.tolist()])

print (df2)
                    join          <lambda_0>
Name_ID                                     
Name1    5875383;5901847  [5875383, 5901847]
Name2            5285200           [5285200]
Name3    2342345;6463736  [2342345, 6463736]
0 голосов
/ 05 октября 2019
  • Основная проблема
    • Не могу join int
Name_ID  Adress_ID
  Name1    5875383
  Name1    5901847
  Name2    5285200
  Name3    2342345
  Name3    6463736

def fix_my_stuff(x):
    x = x.tolist()
    x = '; '.join([str(y) for y in x])
    return(x)

df_updated = df.groupby('Name_ID').agg(lambda x: fix_my_stuff(x)).reset_index()
print(df_updated)

Name_ID         Adress_ID
  Name1  5875383; 5901847
  Name2           5285200
  Name3  2342345; 6463736
0 голосов
/ 01 октября 2019

сначала вам нужно убедиться, что Address_ID равен string

, затем вы можете применить эту функцию:

df.groupby('Name_ID').agg(lambda x: ':'.join(list(x.values)))

подробнее о 'str'.join метод

...