Добавить столбцы разной длины pandas

У меня проблема с добавлением столбцов в pandas. У меня DataFrame, размер nxk. И в процессе мне нужно добавить столбцы с размером mx1, где m = [1, n], но я не знаю m.

Когда я попытаюсь сделать это:

df['Name column'] = data    
# type(data) = list

результат:

AssertionError: Length of values does not match length of index   

Можно ли добавить столбцы с разной длиной?

Ответы

Ответ 1

Используйте concat и pass axis=1 и ignore_index=True:

In [38]:

import numpy as np
df = pd.DataFrame({'a':np.arange(5)})
df1 = pd.DataFrame({'b':np.arange(4)})
print(df1)
df
   b
0  0
1  1
2  2
3  3
Out[38]:
   a
0  0
1  1
2  2
3  3
4  4
In [39]:

pd.concat([df,df1], ignore_index=True, axis=1)
Out[39]:
   0   1
0  0   0
1  1   1
2  2   2
3  3   3
4  4 NaN

Ответ 2

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

Результирующая ось будет помечена 0,..., n - 1. Это полезно, если вы объединяете объекты, у которых ось конкатенации не имеет значимой индексной информации.

Похоже, имена столбцов ('Name column') имеют значение для оригинального постера/оригинального вопроса.

Чтобы сохранить имена столбцов, используйте pandas.concat, но не ignore_index (значение ignore_index по ignore_index равно false; поэтому вы можете вообще пропустить этот аргумент). Продолжайте использовать axis=1:

import pandas

# Note these columns have 3 rows of values:
original = pandas.DataFrame({
    'Age':[10, 12, 13], 
    'Gender':['M','F','F']})

# Note this column has 4 rows of values:
additional = pandas.DataFrame({
    'Name': ['Nate A', 'Jessie A', 'Daniel H', 'John D']
})

new = pandas.concat([original, additional], axis=1) 
# Identical:
# new = pandas.concat([original, additional], ignore_index=False, axis=1) 

print(new.head())

#          Age        Gender        Name
#0          10             M      Nate A
#1          12             F    Jessie A
#2          13             F    Daniel H
#3         NaN           NaN      John D

Обратите внимание, что у Джона Д. нет возраста или пола.

Ответ 3

Мы можем добавить другой размер значений списка в DataFrame.

пример

a = [0,1,2,3]
b = [0,1,2,3,4,5,6,7,8,9]
c = [0,1]

Найти длину всего списка

la,lb,lc = len(a),len(b),len(c)
# now find the max
max_len = max(la,lb,lc)

Изменить все в соответствии с определенной максимальной длиной (не в этом примере

if not max_len == la:
  a.extend(['']*(max_len-la))
if not max_len == lb:
  b.extend(['']*(max_len-lb))
if not max_len == lc:
  c.extend(['']*(max_len-lc))

Теперь весь список одинаковой длины и создайте фрейм данных

pd.DataFrame({'A':a,'B':b,'C':c}) 

Окончательный результат

   A  B  C
0  1  0  1
1  2  1   
2  3  2   
3     3   
4     4   
5     5   
6     6   
7     7   
8     8   
9     9