Объединение элементов типа массива Pandas по столбцам

#python #pandas

#питон #панды

Вопрос:

Я хочу объединить элементы типа массива Pandas по элементам столбцов.

Ввод

 Year Month ['2021','2020',''] ['11','12',''] ['2019','2020',''] ['11','12',''] 

Выход

 Output ['202111','202012',''] ['201911','202012',''] 

Ответ №1:

Используйте понимание списка, если возможна разная длина списков в строках:

 df['Output'] = [[c   d for c, d in zip(a, b)] for a, b in zip(df['Year'], df['Month'])] print (df)  Year Month Output 0 [2021, 2020, ] [11, 12, ] [202111, 202012, ] 1 [2019, 2020, ] [11, 12, ] [201911, 202012, ]  

Если в обоих столбцах/строках одинаковая длина (здесь 3), используйте:

 df1 = pd.DataFrame(df['Year'].tolist())   pd.DataFrame(df['Month'].tolist()) print (df1)  0 1 2 0 202111 202012  1 201911 202012    df['Output'] = df1.to_numpy().tolist() print (df)  Year Month Output 0 [2021, 2020, ] [11, 12, ] [202111, 202012, ] 1 [2019, 2020, ] [11, 12, ] [201911, 202012, ]  

Комментарии:

1. Размер моих данных составляет 5 миллионов строк. Можем ли мы сделать это без петель?

2. @Datadev технически вы можете сделать это только с помощью циклов. даже если вы сделаете это в excel вручную, алгоритм excel выполнит их в виде цикла.

Ответ №2:

Вы можете попробовать с explode :

 df['Output'] = np.sum(df.explode(['Year', 'Month']), axis=1)   .groupby(level=0).apply(list)  

Для 5 000 000 строк описанная выше операция заняла 1 минуту 2 секунды.

Установка:

 data = {'Year': [['2021', '2020', ''], ['2019', '2020', ''], ['2018']],  'Month': [['11', '12', ''], ['11', '12', ''], ['07']]} df = pd.DataFrame(data) df1 = df.reindex(df.index.repeat(1666666)).reset_index(drop=True)  In [721]: %timeit -n 1 np.sum(df1.explode(['Year', 'Month']), axis=1).groupby(level=0).apply(list) 1min 2s ± 998 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)