Chuyển đổi khung dữ liệu gấu trúc thành chuỗi


97

Tôi hơi mới với gấu trúc. Tôi có một khung dữ liệu gấu trúc là 1 hàng x 23 cột.

Tôi muốn chuyển cái này thành một bộ truyện? Tôi đang tự hỏi cách đáng sợ nhất để làm điều này là gì?

Tôi đã thử pd.Series(myResults)nhưng nó phàn nàn ValueError: cannot copy sequence with size 23 to array axis with dimension 1. Nó không đủ thông minh để nhận ra nó vẫn là một "vector" trong thuật ngữ toán học.

Cảm ơn!

Câu trả lời:


63

Nó không đủ thông minh để nhận ra nó vẫn là một "vector" trong thuật ngữ toán học.

Nói đúng hơn là nó đủ thông minh để nhận ra sự khác biệt về kích thước. :-)

Tôi nghĩ điều đơn giản nhất bạn có thể làm là chọn hàng đó theo vị trí bằng cách sử dụng iloc, điều này cung cấp cho bạn một Chuỗi với các cột là chỉ mục mới và các giá trị là các giá trị:

>>> df = pd.DataFrame([list(range(5))], columns=["a{}".format(i) for i in range(5)])
>>> df
   a0  a1  a2  a3  a4
0   0   1   2   3   4
>>> df.iloc[0]
a0    0
a1    1
a2    2
a3    3
a4    4
Name: 0, dtype: int64
>>> type(_)
<class 'pandas.core.series.Series'>

2
Hoặc, một cách khác:df.T
ako

14
@ako: df.Ttuy nhiên, không sản xuất một Series, chỉ là một DataFrame chuyển vị.
DSM

@DSM. Đó là sự thật, df.T.iloc [0]
Antonio Andrés

Vấn đề duy nhất với việc sử dụng df.iloclà nếu bạn có một df trống, điều này sẽ làm tăng một IndexError. Để tránh điều đó, sau khi chuyển đổi df của bạn, hãy sử dụng df.squeezephương pháp này. Tham chiếu tới pandas.pydata.org/pandas-docs/stable/reference/api/…
Nicolas Fonteyne

60

Bạn có thể chuyển khung dữ liệu một hàng (vẫn dẫn đến một khung dữ liệu) và sau đó ép các kết quả thành một chuỗi (nghịch đảo của to_frame).

df = pd.DataFrame([list(range(5))], columns=["a{}".format(i) for i in range(5)])

>>> df.T.squeeze()  # Or more simply, df.squeeze() for a single row dataframe.
a0    0
a1    1
a2    2
a3    3
a4    4
Name: 0, dtype: int64

Lưu ý: Để phù hợp với điểm do @IanS nêu ra (mặc dù nó không nằm trong câu hỏi của OP), hãy kiểm tra kích thước của khung dữ liệu. Tôi giả sử đó dflà khung dữ liệu, nhưng các trường hợp cạnh là khung dữ liệu trống, khung dữ liệu có hình dạng (1, 1) và khung dữ liệu có nhiều hơn một hàng, trong trường hợp đó, việc sử dụng sẽ triển khai chức năng mong muốn của chúng.

if df.empty:
    # Empty dataframe, so convert to empty Series.
    result = pd.Series()
elif df.shape == (1, 1)
    # DataFrame with one value, so convert to series with appropriate index.
    result = pd.Series(df.iat[0, 0], index=df.columns)
elif len(df) == 1:
    # Convert to series per OP's question.
    result = df.T.squeeze()
else:
    # Dataframe with multiple rows.  Implement desired behavior.
    pass

Điều này cũng có thể được đơn giản hóa theo dòng câu trả lời do @themachinist cung cấp.

if len(df) > 1:
    # Dataframe with multiple rows.  Implement desired behavior.
    pass
else:
    result = pd.Series() if df.empty else df.iloc[0, :]

11
Lưu ý rằng tôi đã gặp phải một vấn đề nhỏ khi sử dụng squeeze. Đối với một khung dữ liệu của hình dạng, (1, 1)nó sẽ trả về, không phải là một chuỗi có độ dài 1, mà là một đại lượng vô hướng không có nhiều. Điều này dẫn đến một lỗi khó bắt khi sử dụng squeezetrên các đối tượng có độ dài không xác định (ví dụ: với groupby).
IanS

2
"Cảm ơn bạn! Df.squeeze () hoạt động khi df.iloc [:, 0] & df.ix [:, 0] đều tạo ra quá nhiều lỗi chỉ mục"
Afflatus

3
Và tại sao nghịch đảo của to_framekhông to_serieshoặc pd.Series(df)...?
jhin

4
Bạn không cần phải.T
elgehelge

1
@IanS chuyển đối số df.squeeze(axis=0)hoặc df.squeeze(axis=1)(tùy thuộc vào trục bạn muốn bảo tồn) để tránh điều đó
Nicolas Fonteyne


4

Cách khác -

Giả sử myResult là dataFrame chứa dữ liệu của bạn ở dạng 1 cột và 23 hàng

// label your columns by passing a list of names
myResult.columns = ['firstCol']

// fetch the column in this way, which will return you a series
myResult = myResult['firstCol']

print(type(myResult))

Theo cách tương tự, bạn có thể lấy chuỗi từ Dataframe với nhiều cột.


3

Bạn cũng có thể sử dụng stack ()

df= DataFrame([list(range(5))], columns = [“a{}”.format(I) for I in range(5)])

Sau khi bạn chạy df, sau đó chạy:

df.stack()

Bạn có được khung dữ liệu của mình theo chuỗi


0
data = pd.DataFrame({"a":[1,2,3,34],"b":[5,6,7,8]})
new_data = pd.melt(data)
new_data.set_index("variable", inplace=True)

Điều này cung cấp một khung dữ liệu với chỉ mục là tên cột của dữ liệu và tất cả dữ liệu đều có trong cột "giá trị"


5
Chào mừng bạn đến với Stack Overflow! Làm thế nào để trả lời câu hỏi này? Mã của bạn không trả về một dòng giống như câu hỏi yêu cầu
Gricey
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.