Chuyển đổi Dòng gấu trúc sang DataFrame


92

Tôi có một loạt Pandas sf:

email
email1@email.com    [1.0, 0.0, 0.0]
email2@email.com    [2.0, 0.0, 0.0]
email3@email.com    [1.0, 0.0, 0.0]
email4@email.com    [4.0, 0.0, 0.0]
email5@email.com    [1.0, 0.0, 3.0]
email6@email.com    [1.0, 5.0, 0.0]

Và tôi muốn chuyển đổi nó thành DataFrame sau:

index | email             | list
_____________________________________________
0     | email1@email.com  | [1.0, 0.0, 0.0]
1     | email2@email.com  | [2.0, 0.0, 0.0]
2     | email3@email.com  | [1.0, 0.0, 0.0]
3     | email4@email.com  | [4.0, 0.0, 0.0]
4     | email5@email.com  | [1.0, 0.0, 3.0]
5     | email6@email.com  | [1.0, 5.0, 0.0]

Tôi đã tìm ra cách để làm điều đó, nhưng tôi nghi ngờ đó là cách hiệu quả hơn:

df1 = pd.DataFrame(data=sf.index, columns=['email'])
df2 = pd.DataFrame(data=sf.values, columns=['list'])
df = pd.merge(df1, df2, left_index=True, right_index=True)

4
Trong các phiên bản gấu trúc gần đây hơn, điều này có thể đạt được chỉ với một lần reset_indexgọi .
cs95

Câu trả lời:


137

Thay vì tạo 2 dfs tạm thời, bạn chỉ có thể chuyển chúng dưới dạng các tham số trong một dict bằng cách sử dụng hàm tạo DataFrame:

pd.DataFrame({'email':sf.index, 'list':sf.values})

Có rất nhiều cách để xây dựng một df, hãy xem tài liệu


một lựa chọn tuyệt vời là để concat nếu loạt của bạn có trục cùngpd.concat([sf.index, sf.values], axis=1)
Lauren

63

to_frame () :

Bắt đầu với Sê-ri sau, df:

email
email1@email.com    A
email2@email.com    B
email3@email.com    C
dtype: int64

Tôi sử dụng to_frame để chuyển đổi chuỗi thành DataFrame:

df = df.to_frame().reset_index()

    email               0
0   email1@email.com    A
1   email2@email.com    B
2   email3@email.com    C
3   email4@email.com    D

Bây giờ tất cả những gì bạn cần là đổi tên tên cột và đặt tên cho cột chỉ mục:

df = df.rename(columns= {0: 'list'})
df.index.name = 'index'

DataFrame của bạn đã sẵn sàng để phân tích thêm.

Cập nhật: Tôi vừa xem qua liên kết này , nơi các câu trả lời tương tự một cách đáng ngạc nhiên với của tôi ở đây.


1
series_obj.to_frame()làm! Tôi xuất loại lớp này<class 'pandas.core.frame.DataFrame'>
Johnny Zhang

1
Tại sao sử dụng to_frame().reset_index()thay vì chỉ reset_index? Bạn thậm chí có thể làmreset_index(name='list')
câm

17

Series.reset_indexvới namelý lẽ

Thông thường, trường hợp sử dụng xuất hiện trong đó Chuỗi cần được thăng cấp thành DataFrame. Nhưng nếu Sê-ri không có tên, thì reset_indexsẽ dẫn đến một cái gì đó như,

s = pd.Series([1, 2, 3], index=['a', 'b', 'c']).rename_axis('A')
s

A
a    1
b    2
c    3
dtype: int64

s.reset_index()

   A  0
0  a  1
1  b  2
2  c  3

Nơi bạn thấy tên cột là "0". Chúng tôi có thể sửa lỗi này bằng cách chỉ định một nametham số.

s.reset_index(name='B')

   A  B
0  a  1
1  b  2
2  c  3

s.reset_index(name='list')

   A  list
0  a     1
1  b     2
2  c     3

Series.to_frame

Nếu bạn muốn tạo DataFrame mà không quảng bá chỉ mục thành một cột, hãy sử dụng Series.to_frame, như được đề xuất trong câu trả lời này . Điều này cũng hỗ trợ một tham số tên.

s.to_frame(name='B')

   B
A   
a  1
b  2
c  3

pd.DataFrame Constructor

Bạn cũng có thể làm điều tương tự như Series.to_framebằng cách chỉ định một columnstham số:

pd.DataFrame(s, columns=['B'])

   B
A   
a  1
b  2
c  3

Tôi đã tự hỏi tại sao người ta có thể sử dụng to_framethay vì reset_index, nhưng có bao giờ có lý do chính đáng để sử dụng cả hai không? tại đây
câm

@dumbledad chủ yếu là tiện ích. Nếu bạn muốn một khung dữ liệu col duy nhất có chỉ mục, hãy sử dụng to_frame (). Nếu bạn cần hai cột (một từ chỉ mục chuỗi và cột kia từ chính các giá trị chuỗi), hãy đi với reset_index ().
cs95,

Và điều gì sẽ xảy ra nếu tôi muốn chuyển đổi Series thành DataFrame với chỉ mục Seires được sử dụng làm tên các cột DataFrame (tức là đã hoán vị)? to_framedường như không có lập luận để làm điều này. Cảm ơn.
Bối rối

@ Cơ sở sử dụng to_frame (). T để chuyển đổi nó
cs95

17

Câu trả lời một dòng sẽ là

myseries.to_frame(name='my_column_name')

Hoặc là

myseries.reset_index(drop=True, inplace=True)  # As needed

4

Series.to_framecó thể được sử dụng để chuyển đổi a Seriesthành DataFrame.

# The provided name (columnName) will substitute the series name
df = series.to_frame('columnName')

Ví dụ,

s = pd.Series(["a", "b", "c"], name="vals")
df = s.to_frame('newCol')
print(df)

   newCol
0    a
1    b
2    c

1

có thể được xếp loại là một cách không cần quan tâm để làm điều này nhưng điều này sẽ cho kết quả bạn muốn trong một dòng:

new_df = pd.DataFrame(zip(email,list))

Kết quả:

               email               list
0   email1@email.com    [1.0, 0.0, 0.0]
1   email2@email.com    [2.0, 0.0, 0.0]
2   email3@email.com    [1.0, 0.0, 0.0]
3   email4@email.com    [4.0, 0.0, 3.0]
4   email5@email.com    [1.0, 5.0, 0.0]
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.