Lưu trữ hàng của một mảng NumPy trong một cột của bảng Pandas có xu hướng là một sai lầm vì làm bất kỳ điều gì hữu ích với dữ liệu trong biểu mẫu này thật khó xử.
Dưới đây là hai cách để có được các dữ liệu mong muốn, không ai trong số đó là rất đẹp:
import numpy as np
import pandas as pd
import operator
pa = pd.DataFrame({'a':np.array([[1.,4.],[2.],[3.,4.,5.]])})
print(pa['a'].map(operator.itemgetter(0)))
# 0 1
# 1 2
# 2 3
# Name: a, dtype: float64
Hoặc bạn chỉ có thể sử dụng danh sách hiểu:
print([item[0] for item in pa['a']])
# [1.0, 2.0, 3.0]
Đó phương pháp này ngoại hình thứ hai dễ dàng hơn nhiều có thể là dấu hiệu cho thấy danh sách các danh sách có thể là cấu trúc dữ liệu thích hợp hơn ở đây.
Nếu bạn muốn sử dụng một bảng Pandas, nó có thể là tốt hơn để lưu trữ mỗi giá trị trong cột riêng của mình:
0 1 2
0 1 4 NaN
1 2 NaN NaN
2 3 4 5
này có thể đòi hỏi nhiều bộ nhớ hơn, nhưng dữ liệu hiện đang ở một hình thức có thể hữu ích hơn.
Bạn có thể chuyển đổi DataFrame của bạn vào cái mới này như thế này:
In [314]: pa = pa['a'].apply(lambda row: pd.Series(row)); pa
Out[314]:
0 1 2
0 1 4 NaN
1 2 NaN NaN
2 3 4 5
Và bây giờ chọn giá trị đầu tiên từ mỗi hàng là dễ dàng:
In [315]: pa[0]
Out[315]:
0 1
1 2
2 3
Name: 0, dtype: float64
Nó cũng nhanh hơn nhiều so với các tùy chọn khác :
In [5]: pa2 = pa['a'].apply(lambda row: pd.Series(row))
In [6]: %timeit pa2[0]
100000 loops, best of 3: 1.95 µs per loop
In [10]: %timeit [item[0] for item in pa['a']]
100000 loops, best of 3: 14.4 µs per loop
In [9]: %timeit pa['a'].map(operator.itemgetter(0))
10000 loops, best of 3: 44 µs per loop
In [13]: %timeit pa['a'].str[0]
10000 loops, best of 3: 67.2 µs per loop
cảm ơn. giải pháp tốt đẹp – jankos