팬더에서 두 개의 시리즈를 DataFrame에 결합


278

나는 두 개의 시리즈 s1s2가지고 있으며 동일한 (비 연속적) 인덱스를 가지고 있습니다. DataFrame에서 두 열을 결합 s1하고 s2두 인덱스로 만들고 인덱스 중 하나를 세 번째 열로 유지하려면 어떻게합니까?

답변:


417

나는 이것을 concat하는 좋은 방법 이라고 생각 합니다. 그것들이 존재한다면 Series의 이름 속성을 열로 사용합니다 (그렇지 않으면 단순히 번호를 매 깁니다).

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
이것은 실제로 (복사 솔루션과 비교하여) 복사도 피합니다.
Jeff

한 가지 경우, 그것은 'ValueError : 둘 이상의 요소를 가진 배열의 진실 값이 모호합니다. a.any () 또는 a.all () '-아이디어가 있습니까?
user7289

@ user7289 어디에서 왔는지 잘 모르겠습니다. 다른 질문으로 물어볼 수 있습니까?
Andy Hayden

@AndyHayden : 하나 또는 두 개의 인덱스를 따라 중복이 있으면 어떻게해야합니까?
Mannaggia

2
@dafinguzman "이 함수를 지속적으로 재사용"이란 의미는 concat을 한 번만 수행 하거나 pd.concat([list_of_dataframes])여러 번 연결하는 것을 선호한다는 것 new_df = pd.DataFrame(); for df in list_of_dsf: new_df = pd.concat([new_df, df])입니다.
Andy Hayden

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'))
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으로 dictwith Series를 사용하고 열 이름을 키로 만들 수 있습니다 . Series값을 찾으면 Series인덱스를 인덱스의 일부로 사용합니다 DataFrame. 이 데이터 정렬은 Pandas의 주요 특권 중 하나입니다. 따라서 다른 요구 사항이 없으면 새로 만든 DataFrame값이 중복됩니다. 위의 예 data['idx_col']에서와 동일한 데이터를가집니다 data.index.


13

내가 대답 할 수 있다면.

시리즈를 데이터 프레임으로 변환하는 기본 원리는

1. 개념적 수준에서 데이터 프레임의 모든 열은 시리즈입니다.

그리고 모든 열 이름은 계열에 매핑되는 키 이름입니다.

두 가지 이상의 개념을 염두에두면 시리즈를 데이터 프레임으로 변환하는 여러 가지 방법을 생각할 수 있습니다. 한 가지 쉬운 해결책은 다음과 같습니다.

여기에 두 시리즈 만들기

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 배열 또는 iseries를 데이터 프레임으로 변환 한 다음 키로 '예측'으로 추가 열을 추가했습니다. 데이터 프레임을 다시 목록으로 변환해야하는 경우 values.tolist ()

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

list=output.values.tolist()     
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.