Kết hợp hai Sê-ri thành Khung dữ liệu trong gấu trúc


277

Tôi có hai Series s1s2có cùng chỉ số (không liên tiếp). Làm cách nào để kết hợp s1s2trở thành hai cột trong DataFrame và giữ một trong các chỉ mục làm cột thứ ba?

Câu trả lời:


415

Tôi nghĩ concatlà một cách tốt đẹp để làm điều này. Nếu chúng có mặt, nó sử dụng các thuộc tính tên của Sê-ri làm cột (nếu không, nó chỉ đơn giản là đánh số chúng):

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

Lưu ý: Điều này mở rộng đến hơn 2 Series.


5
điều này thực sự cũng tránh sao chép (so với giải pháp chính tả)
Jeff

Trong một trường hợp, dường như nó đang nói với tôi 'ValueError: Giá trị thật của một mảng có nhiều hơn một phần tử là mơ hồ. Sử dụng a.any () hoặc a.all () '- có ý tưởng nào không?
dùng7289

@ user7289 không chắc chắn nơi đó sẽ đến từ đâu, bạn có thể hỏi đây là một câu hỏi khác không?
Andy Hayden

@AndyHayden: nếu có các bản sao dọc theo một hoặc cả hai chỉ mục thì sao?
Mannaggia

2
@dafinguzman "liên tục tái sử dụng chức năng này" có nghĩa là bạn nên ưu tiên thực hiện concat một lần pd.concat([list_of_dataframes]) so với concating nhiều lần new_df = pd.DataFrame(); for df in list_of_dsf: new_df = pd.concat([new_df, df])hoặc tương tự.
Andy Hayden

38

Tại sao bạn không sử dụng .to_frame nếu cả hai có cùng chỉ mục?

> = v0.23

a.to_frame().join(b)

< v0.23

a.to_frame().join(b.to_frame())

4
Có lẽ điều này sẽ phù hợp hơn: a.to_frame (name = 'a'). Tham gia (b.to_frame (name = 'b'))
user3282777

33

Gấu trúc sẽ tự động sắp xếp những thứ này được truyền theo chuỗi và tạo ra chỉ số chung Chúng tình cờ giống nhau ở đây. reset_indexdi chuyển chỉ mục đến một cột.

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

Mã ví dụ:

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

Pandas cho phép bạn tạo một DataFrametừ a dictvới Seriescác giá trị và tên cột làm khóa. Khi nó tìm thấy một Seriesgiá trị, nó sử dụng Serieschỉ mục như là một phần của DataFramechỉ mục. Căn chỉnh dữ liệu này là một trong những đặc quyền chính của Pandas. Do đó, trừ khi bạn có nhu cầu khác, mới được tạo DataFramecó giá trị trùng lặp. Trong ví dụ trên, data['idx_col']có cùng dữ liệu với data.index.


13

Nếu tôi có thể trả lời điều này.

Các nguyên tắc cơ bản đằng sau chuỗi chuyển đổi sang khung dữ liệu là để hiểu rằng

1. Ở cấp độ khái niệm, mỗi cột trong khung dữ liệu là một chuỗi.

2. Và, mỗi tên cột là một tên chính ánh xạ tới một chuỗi.

Nếu bạn luôn nhớ đến hai khái niệm trên, bạn có thể nghĩ ra nhiều cách để chuyển đổi chuỗi thành khung dữ liệu. Một giải pháp dễ dàng sẽ như thế này:

Tạo hai loạt ở đây

import pandas as pd

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

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

Tạo một khung dữ liệu trống chỉ với các tên cột mong muốn

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

Đặt giá trị chuỗi trong khung dữ liệu bằng khái niệm ánh xạ

df['Column_name#1'] = series_1

df['Column_name#2'] = series_2

Kiểm tra kết quả ngay bây giờ

df.head(5)

6

Không chắc chắn tôi hoàn toàn hiểu câu hỏi của bạn, nhưng đây có phải là những gì bạn muốn làm?

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

( index=s1.indexthậm chí không cần thiết ở đây)



1

Tôi đã sử dụng gấu trúc để chuyển đổi mảng numpy hoặc iseries của mình sang một khung dữ liệu sau đó thêm và thêm cột bổ sung theo khóa như 'dự đoán'. Nếu bạn cần dataframe được chuyển đổi trở lại danh sách thì hãy sử dụng value.tolist ()

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

list=output.values.tolist()     
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.