Pandas 데이터 프레임에 열 추가


104

이것은 아마도 쉬울 수 있지만 다음 데이터가 있습니다.

데이터 프레임 1 :

index dat1
0     9
1     5

데이터 프레임 2 :

index dat2
0     7
1     6

다음과 같은 형식의 데이터 프레임이 필요합니다.

index dat1  dat2
0     9     7
1     5     6

append방법을 사용해 보았지만 교차 조인 (예 : 데카르트 곱) 이 생겼습니다 .

이를 수행하는 올바른 방법은 무엇입니까?


2
join방법 을 시도 했습니까 ?
BrenBarn

1
data_frame_1 [ 'dat2'] = data_frame_2 [ 'dat2']
lowtech

@lowtech : 인덱스가 제대로 짝을 이루는 지 확인합니까?
BenDundee

@BenDundee은 : 네, 그것은 않습니다
lowtech

답변:


131

일반적으로 조인을 찾고있는 것 같습니다.

> dat1 = pd.DataFrame({'dat1': [9,5]})
> dat2 = pd.DataFrame({'dat2': [7,6]})
> dat1.join(dat2)
   dat1  dat2
0     9     7
1     5     6

45
또는 pd.concat([dat1, dat2], axis=1)이 경우.
DSM

2
@BenDundee Join 및 concat은 내부적으로 동일한 코드를 많이 사용하므로 "올바른"방법은 가장자리 사례를 고려할 때만 중요합니다. 예를 들어 여기에서 두 DataFrames에 'data'열이 있으면 조인이 실패 하지만 concat은 'data'라는 두 개의 열을 제공합니다.
U2EF1

@ U2EF1 : 나는 당신의 반응과 나의 반응에 대해 이야기하고있었습니다. 고양이 : 피부하는 N 방법 항상있다
BenDundee

@BenDundee 알겠습니다. 이 방법은 고유 인덱스를 버리고 더 복잡한 경우에는 더 이상한 부작용이 있습니다. 예를 들어 '데이터'라는 두 개의 열이있는 경우 그룹화 / 합산은 서로 다른 데이터 열을 합산하기 시작하는데, 이는 거의 확실하지 않습니다. 문자열 데이터가 연결됩니다.
U2EF1

1
@ jeremy-z가 지적했듯이 동일한 인덱스를 공유하지 않는 경우 두 데이터 세트의 인덱스를 재설정하는 것이 매우 중요합니다. 그렇지 않으면 NaN 행이 많은 하나의 데이터 세트가 생성됩니다.
Israel Varea 19

57

다음을 사용할 수도 있습니다.

dat1 = pd.concat([dat1, dat2], axis=1)

1
발생할 경우 InvalidIndexError: Reindexing only valid with uniquely valued Index objects , 당신은 사용할 수 있습니다 :pd.concat([dat1.reset_index(), dat2], axis=1)
beyondfloatingpoint

40

모두 join()concat()방법은 문제를 해결할 수 있습니다. 그러나 언급해야 할 경고가 하나 있습니다 . 인덱스를 재설정 join()하거나 concat()다른 DataFrame에서 일부 행을 선택하여 일부 데이터 프레임을 처리하려는 경우.

아래의 한 예는 join 및 concat의 흥미로운 동작을 보여줍니다.

dat1 = pd.DataFrame({'dat1': range(4)})
dat2 = pd.DataFrame({'dat2': range(4,8)})
dat1.index = [1,3,5,7]
dat2.index = [2,4,6,8]

# way1 join 2 DataFrames
print(dat1.join(dat2))
# output
   dat1  dat2
1     0   NaN
3     1   NaN
5     2   NaN
7     3   NaN

# way2 concat 2 DataFrames
print(pd.concat([dat1,dat2],axis=1))
#output
   dat1  dat2
1   0.0   NaN
2   NaN   4.0
3   1.0   NaN
4   NaN   5.0
5   2.0   NaN
6   NaN   6.0
7   3.0   NaN
8   NaN   7.0

#reset index 
dat1 = dat1.reset_index(drop=True)
dat2 = dat2.reset_index(drop=True)
#both 2 ways to get the same result

print(dat1.join(dat2))
   dat1  dat2
0     0     4
1     1     5
2     2     6
3     3     7


print(pd.concat([dat1,dat2],axis=1))
   dat1  dat2
0     0     4
1     1     5
2     2     6
3     3     7

잘 말하고 좋은 지적입니다. 나는 인덱스를 재설정하지 않고 시도하고 많은 NULLS를 생성했습니다
Anand

재설정 단계를 수행하지 않으면 내 데이터가 훌륭하고 좋아 보였지만 분명히 뒤에서 제대로 작동하지 않았습니다. 지적 해 주셔서 감사합니다! 재설정으로 내 모델이 가동되었습니다!
Ionuț Ciuta

이것이 받아 들여진 대답이어야합니다! 인덱스를 재설정하지 않으면 항상 NaN을 생성합니다.
Srivatsan

이 단계는 저를 구했습니다. concat과 join이 많은 NaN을 던지는 이유를 이해하려고했습니다. 공유해 주셔서 감사합니다.
Gustavo Rottgering

0

사실 :

data_joined = dat1.join(dat2)
print(data_joined)

-3

올바른 Google 검색의 문제 :

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