Об'єднання двох серій у DataFrame в пандах


278

У мене дві серії s1і s2з однаковими (непослідовними) індексами. Як з’єднати s1та s2бути двома стовпцями в DataFrame та зберегти один з індексів як третій стовпець?

Відповіді:


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
це насправді уникає копіювання (порівняно з рішенням диктату)
Джефф

В одному випадку, здається, мені кажуть «ValueError: Значення істинності масиву з більш ніж одним елементом неоднозначне. Використовувати a.any () або a.all () '- будь-які ідеї?
user7289

@ user7289 не знаєте, звідки це буде, ви можете задати це ще одним питанням?
Енді Хайден

@AndyHayden: що робити, якщо уздовж одного або обох індексів є дублікати?
Mannaggia

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

4
Можливо, це буде доречніше: a.to_frame (name = 'a'). Join (b.to_frame (name = 'b'))
користувач3282777

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індексу. Це вирівнювання даних є одним з головних переваг Панди. Отже, якщо у вас немає інших потреб, щойно створене DataFrameмає подвоєне значення. У наведеному вище прикладі data['idx_col']є ті ж дані, що і data.index.


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)

6

Не впевнений, що я повністю розумію ваше запитання, але чи це ви хочете зробити?

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

( index=s1.indexнавіть тут не потрібно)



1

Я використовував панди, щоб перетворити свій numpy масив або ісерії в кадр даних, потім додав і додав додатковий стовпець за ключем як "прогнозування". Якщо вам потрібен кадр даних, перетворений назад до списку, тоді використовуйте values.tolist ()

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

list=output.values.tolist()     
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.