Возьмите несколько списков в dataframe

165

Как взять несколько списков и поместить их в разные столбцы в кадре данных Python? Я попробовал это решение, но у меня возникли проблемы.

Попытка 1:

  • Имейте три списка, и соедините их вместе и используйте это res = zip(lst1,lst2,lst3)
  • Дает только один столбец

Попытка 2:

percentile_list = pd.DataFrame({'lst1Tite' : [lst1],
                                'lst2Tite' : [lst2],
                                'lst3Tite' : [lst3] }, 
                                columns=['lst1Tite','lst1Tite', 'lst1Tite'])
  • выдает либо одну строку на 3 столбца (как указано выше), либо, если я транспонирую, это 3 строки и 1 столбец

Как получить 100 строк (длина каждого независимого списка) по 3 столбцам (три списка) pandas dataframe?

jfalkson
источник

Ответы:

280

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

import pandas as pd
lst1 = range(100)
lst2 = range(100)
lst3 = range(100)
percentile_list = pd.DataFrame(
    {'lst1Title': lst1,
     'lst2Title': lst2,
     'lst3Title': lst3
    })

percentile_list
    lst1Title  lst2Title  lst3Title
0          0         0         0
1          1         1         1
2          2         2         2
3          3         3         3
4          4         4         4
5          5         5         5
6          6         6         6
...

Если вам нужно более производительное решение, которое вы можете использовать, np.column_stackа не zipкак в первой попытке, в этом примере это примерно в 2 раза быстрее, однако, на мой взгляд, это требует больших затрат на удобочитаемость:

import numpy as np
percentile_list = pd.DataFrame(np.column_stack([lst1, lst2, lst3]), 
                               columns=['lst1Title', 'lst2Title', 'lst3Title'])
maxymoo
источник
Является ли np.column_stack представлением или копирует данные? (Если копировать, кажется, что это могло бы быть гораздо более эффективным (O (1), а не O (n)).
user48956
@maxymoo можно ли в именах столбцов автоматически указывать имя списка?
joe5
1
стек пустых столбцов не работает, если списки имеют разные типы данных
user6386155
54

Добавление к ответу Адитьи Гуру здесь. Нет необходимости использовать карту. Вы можете сделать это просто:

pd.DataFrame(list(zip(lst1, lst2, lst3)))

Это установит имена столбцов как 0,1,2. Чтобы установить собственные имена столбцов, вы можете передать аргумент ключевого слова columnsвышеописанному методу.

pd.DataFrame(list(zip(lst1, lst2, lst3)),
              columns=['lst1_title','lst2_title', 'lst3_title'])
Абхинав Гупта
источник
3
В Python 3.8 и Pandas 1.0 нам не нужно использовать функцию списка, поскольку DataFrame ожидает итеративный объект, а zip () возвращает итеративный объект. Итак, pd.DataFrame(zip(lst1, lst2, lst3))тоже надо делать.
Сарфрааз Ахмед
10

Просто добавив, что с использованием первого подхода это можно сделать как -

pd.DataFrame(list(map(list, zip(lst1,lst2,lst3))))
Адитья Гуру
источник
8

Добавление еще одного масштабируемого решения.

lists = [lst1, lst2, lst3, lst4]
df = pd.concat([pd.Series(x) for x in lists], axis=1)
oopsi
источник
Вы можете объяснить это немного?
Зак
1
Вы объединяете (concat) ряды по вертикали (axis = 1), чтобы создать DataFrame из списка списков
yona bendelac
5

Добавляя ответы выше, мы можем создавать на лету

df= pd.DataFrame()
list1 = list(range(10))
list2 = list(range(10,20))
df['list1'] = list1
df['list2'] = list2
print(df)

Надеюсь, поможет !

Вивек Анантан
источник
1

@oopsi использовал, pd.concat()но не включал имена столбцов. Вы могли бы сделать следующее, что, в отличие от первого решения в принятом ответе, дает вам контроль над порядком столбцов (избегает разногласий, которые неупорядочены):

import pandas as pd
lst1 = range(100)
lst2 = range(100)
lst3 = range(100)

s1=pd.Series(lst1,name='lst1Title')
s2=pd.Series(lst2,name='lst2Title')
s3=pd.Series(lst3 ,name='lst3Title')
percentile_list = pd.concat([s1,s2,s3], axis=1)

percentile_list
Out[2]: 
    lst1Title  lst2Title  lst3Title
0           0          0          0
1           1          1          1
2           2          2          2
3           3          3          3
4           4          4          4
5           5          5          5
6           6          6          6
7           7          7          7
8           8          8          8
...
dabru
источник
1

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

list1=[1,2,3,4]
list2=[5,6,7,8]
list3=[9,10,11,12]
  1. pd.DataFrame({'list1':list1, 'list2':list2, 'list3'=list3})

  2. pd.DataFrame(data=zip(list1,list2,list3),columns=['list1','list2','list3'])

Ритеш Кумар
источник
0

Вы можете просто использовать этот следующий код

train_data['labels']= train_data[["LABEL1","LABEL1","LABEL2","LABEL3","LABEL4","LABEL5","LABEL6","LABEL7"]].values.tolist()
train_df = pd.DataFrame(train_data, columns=['text','labels'])
Shaina Raza
источник