Объединение двух серий в DataFrame в пандах

278

У меня две серии s1и s2с одинаковыми (непоследовательными) показателями. Как объединить s1и s2чтобы быть две колонки в DataFrame и сохранить один из показателей , как третий столбец?

user7289
источник

Ответы:

417

Я думаю, что concatэто хороший способ сделать это. Если они присутствуют, он использует атрибуты имени Серии в качестве столбцов (в противном случае он просто нумерует их):

In [1]: s1 = pd.Series([1, 2], index=['A', 'B'], name='s1')

In [2]: s2 = pd.Series([3, 4], index=['A', 'B'], name='s2')

In [3]: pd.concat([s1, s2], axis=1)
Out[3]:
   s1  s2
A   1   3
B   2   4

In [4]: pd.concat([s1, s2], axis=1).reset_index()
Out[4]:
  index  s1  s2
0     A   1   3
1     B   2   4

Примечание: это распространяется на более чем 2 серии.

Энди Хейден
источник
5
на самом деле это также позволяет избежать копирования (по сравнению с решением dict)
Джефф
В одном случае кажется, что он говорит мне: «ValueError: истинное значение массива с более чем одним элементом неоднозначно. Используйте a.any () или a.all () '- есть идеи?
user7289
@ user7289 не уверен, откуда это взялось, можешь задать другой вопрос?
Энди Хейден
@AndyHayden: что, если есть дубликаты по одному или обоим индексам?
Маннаджия,
2
@dafinguzman означает, что «постоянное повторное использование этой функции» означает, что вы предпочитаете выполнять конкатат один раз, pd.concat([list_of_dataframes]) а не многократный new_df = pd.DataFrame(); for df in list_of_dsf: new_df = pd.concat([new_df, df])или аналогичный.
Энди Хейден,
38

Почему бы вам просто не использовать .to_frame, если оба имеют одинаковые индексы?

> = v0.23

a.to_frame().join(b)

< v0.23

a.to_frame().join(b.to_frame())
swmfg
источник
4
Может быть, это было бы более подходящим: a.to_frame (name = 'a'). Join (b.to_frame (name = 'b'))
user3282777
33

Панды автоматически выровняют эти переданные последовательно и создадут объединенный индекс. Здесь они совпадают. reset_indexперемещает индекс в столбец.

In [2]: s1 = Series(randn(5),index=[1,2,4,5,6])

In [4]: s2 = Series(randn(5),index=[1,2,4,5,6])

In [8]: DataFrame(dict(s1 = s1, s2 = s2)).reset_index()
Out[8]: 
   index        s1        s2
0      1 -0.176143  0.128635
1      2 -1.286470  0.908497
2      4 -0.995881  0.528050
3      5  0.402241  0.458870
4      6  0.380457  0.072251
Джефф
источник
16

Пример кода:

a = pd.Series([1,2,3,4], index=[7,2,8,9])
b = pd.Series([5,6,7,8], index=[7,2,8,9])
data = pd.DataFrame({'a': a,'b':b, 'idx_col':a.index})

Панды позволяет создать DataFrameиз dictс Seriesкак значения и имена столбцов в качестве ключей. Когда он находит значение Seriesв качестве значения, он использует Seriesиндекс как часть DataFrameиндекса. Такое выравнивание данных является одним из главных преимуществ Pandas. Следовательно, если у вас нет других потребностей, только что созданная копия DataFrameимеет дублированное значение. В приведенном выше примере data['idx_col']имеет те же данные, что и data.index.

JBN
источник
13

Если я могу ответить на это.

Основы, лежащие в основе преобразования ряда в фрейм данных, - это понять, что

1. На концептуальном уровне каждый столбец во фрейме данных является серией.

2. И каждое имя столбца является ключевым именем, которое сопоставляется с серией.

Если вы помните о двух вышеизложенных понятиях, вы можете придумать множество способов преобразования рядов во фрейм данных. Одно простое решение будет таким:

Создайте две серии здесь

import pandas as pd

series_1 = pd.Series(list(range(10)))

series_2 = pd.Series(list(range(20,30)))

Создайте пустой фрейм данных с нужными именами столбцов

df = pd.DataFrame(columns = ['Column_name#1', 'Column_name#1'])

Поместите значение ряда во фрейм данных, используя концепцию отображения

df['Column_name#1'] = series_1

df['Column_name#2'] = series_2

Проверьте результаты сейчас

df.head(5)
Sateesh
источник
6

Не уверен, что я полностью понимаю ваш вопрос, но вы этого хотите?

pd.DataFrame(data=dict(s1=s1, s2=s2), index=s1.index)

( index=s1.indexздесь даже нет необходимости)

Бертран Л
источник
3

Упрощение решения на основе join():

df = a.to_frame().join(b)
Лоренцо А. Росси
источник
1

Я использовал pandas для преобразования моего массива или iseries в кадр данных, затем добавил и добавил дополнительный столбец по ключу как «прогноз». Если вам нужно преобразовать dataframe обратно в список, используйте values.tolist ()

output=pd.DataFrame(X_test)
output['prediction']=y_pred

list=output.values.tolist()     
Золотой Лев
источник