#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)