Nối cột vào khung dữ liệu gấu trúc


103

Điều này có lẽ dễ dàng, nhưng tôi có dữ liệu sau:

Trong khung dữ liệu 1:

index dat1
0     9
1     5

Trong khung dữ liệu 2:

index dat2
0     7
1     6

Tôi muốn một khung dữ liệu có dạng sau:

index dat1  dat2
0     9     7
1     5     6

Tôi đã thử sử dụng appendphương pháp này, nhưng tôi nhận được một kết hợp chéo (tức là sản phẩm cacte).

Cách phù hợp để làm điều này là gì?


2
Bạn đã thử joinphương pháp này chưa?
BrenBarn

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

@lowtech: điều đó có đảm bảo rằng các chỉ số được ghép nối đúng cách không?
BenDundee

@BenDundee: vâng, đúng vậy
lowtech 17/12/13

Câu trả lời:


129

Nhìn chung, có vẻ như bạn chỉ đang tìm kiếm một sự tham gia:

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

45
Hoặc pd.concat([dat1, dat2], axis=1)trong trường hợp này.
DSM

2
@BenDundee Tham gia và kết hợp sử dụng rất nhiều mã giống nhau bên dưới, vì vậy cách "đúng" có lẽ chỉ quan trọng khi bạn xem xét các trường hợp cạnh. Ví dụ ở đây nếu cả hai DataFrames đều có cột 'dữ liệu' thì kết hợp sẽ không thành công , trong khi một kết hợp sẽ cung cấp cho bạn hai cột có tên 'dữ liệu'.
U2EF1

@ U2EF1: Tôi đang nói về phản hồi của bạn so với của tôi. Luôn luôn có những N cách để da một con mèo :)
BenDundee

@BenDundee Tôi hiểu rồi. Tuy nhiên, phương pháp đó loại bỏ chỉ mục duy nhất và thậm chí còn có các tác dụng phụ khác thường trong những trường hợp phức tạp hơn. Ví dụ: nếu tôi có hai cột có tên là 'dữ liệu', việc nhóm / tính tổng sẽ bắt đầu tính tổng các cột dữ liệu khác nhau, điều này gần như chắc chắn không phải là những gì bạn muốn. Dữ liệu chuỗi sẽ được nối.
U2EF1

1
Như được chỉ ra bởi @ jeremy-z, điều rất quan trọng là phải đặt lại các chỉ mục trong cả hai tập dữ liệu nếu chúng không chia sẻ cùng một chỉ mục. Nếu không, bạn sẽ nhận được một tập dữ liệu với rất nhiều hàng NaN.
Israel Varea

57

Bạn cũng có thể dùng:

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

1
Trong trường hợp bạn gặp phải InvalidIndexError: Reindexing only valid with uniquely valued Index objects , bạn có thể sử dụng:pd.concat([dat1.reset_index(), dat2], axis=1)
beyondfloatingpoint

40

Cả hai join()concat()cách có thể giải quyết vấn đề. Tuy nhiên, có một cảnh báo tôi phải đề cập: Đặt lại chỉ mục trước bạn join()hoặc concat()nếu bạn đang cố gắng xử lý một số khung dữ liệu bằng cách chọn một số hàng từ DataFrame khác.

Một ví dụ dưới đây cho thấy một số hành vi thú vị của phép nối và kết hợp:

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

Nói tốt và điểm tốt. Tôi đã thử mà không đặt lại chỉ mục và tạo ra rất nhiều NULLS
Tương tự

Nếu không thực hiện bước thiết lập lại, dữ liệu của tôi trông ổn và tốt, nhưng rõ ràng là có gì đó không hoạt động tốt ở hậu trường. Cảm ơn đã chỉ ra điều đó! Việc thiết lập lại đã bắt đầu và chạy mô hình của tôi!
Ionuț Ciuta

Đây phải là câu trả lời được chấp nhận! Nó luôn tạo ra NaN nếu chúng ta không đặt lại chỉ mục.
Srivatsan

Bước này đã cứu tôi. Tôi đang cố gắng hiểu tại sao đồng ý và tham gia lại ném rất nhiều NaN. Cảm ơn vì đã chia sẻ điều này.
Gustavo Rottgering

0

Thực tế là:

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

-3

Chỉ là vấn đề của tìm kiếm google phù hợp:

data = dat_1.append(dat_2)
data = data.groupby(data.index).sum()
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.