Добавить столбцы разной длины 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