2016-09-02 47 views
5

Từ các tài liệu, "chạy theo chiều dọc xuống trên hàng đầu tiên (trục 0), và lần thứ hai chạy theo chiều ngang trên cột (trục 1)" Và mã làcách hiểu trục = 0 hoặc 1 trong gấu trúc (Python)?

df1 = pd.DataFrame({"x":[1, 2, 3, 4, 5], 
        "y":[3, 4, 5, 6, 7]}, 
        index=['a', 'b', 'c', 'd', 'e']) 


df2 = pd.DataFrame({"y":[1, 3, 5, 7, 9], 
        "z":[9, 8, 7, 6, 5]}, 
        index=['b', 'c', 'd', 'e', 'f']) 
pd.concat([df1, df2], join='inner') # by default axis=0 

từ trục = 0 (mà tôi giải thích dưới dạng cột) Tôi nghĩ rằng concat chỉ xem xét các cột được tìm thấy trong cả hai khung dữ liệu. Nhưng đầu ra acutal xem xét các hàng được tìm thấy trong cả hai khung dữ liệu (chỉ có phần tử hàng duy nhất 'y') Vậy làm cách nào để hiểu trục = 0,1 chính xác?

+0

Nó không phải về đối số trục. Đó là về '' 'join = 'inner''''. Tra cứu tài liệu! '' 'join: {‘ inner ’,‘ outer ’}, mặc định là‘ outer ’. Cách xử lý các chỉ mục trên trục khác. Bên ngoài cho công đoàn và bên trong cho giao lộ''' – sascha

+1

Hãy nghĩ đến Công giáo La Mã. hoặc "R" - "C" hoặc Hàng - Cột -> Không hoặc Một. – Merlin

Trả lời

0

Trục phiên dịch = 0 để áp dụng thuật toán xuống mỗi cột hoặc tới nhãn hàng (chỉ mục) .. Một lược đồ chi tiết hơn here.

Nếu bạn áp dụng giải thích chung cho trường hợp của mình, thuật toán ở đây là concat. Như vậy đối với trục = 0, nó có nghĩa là:

cho mỗi cột, lấy tất cả các hàng xuống (trên tất cả các dataframes cho concat), và làm liên hệ với họ khi họ đang ở chung (vì bạn chọn join=inner).

Vì vậy, ý nghĩa sẽ là lấy tất cả các cột x và ghép chúng xuống các hàng sẽ chồng từng hàng một. Tuy nhiên, ở đây x không có mặt ở khắp mọi nơi, vì vậy nó không được giữ cho kết quả cuối cùng. Điều tương tự cũng áp dụng cho z. Đối với y kết quả được giữ nguyên là y nằm trong tất cả các khung dữ liệu. Đây là kết quả bạn có.

2

dữ liệu:

In [55]: df1 
Out[55]: 
    x y 
a 1 3 
b 2 4 
c 3 5 
d 4 6 
e 5 7 

In [56]: df2 
Out[56]: 
    y z 
b 1 9 
c 3 8 
d 5 7 
e 7 6 
f 9 5 

Nối ngang (trục = 1), sử dụng yếu tố chỉ số tìm thấy trong cả hai DFS (liên kết bởi chỉ số cho tham gia):

In [57]: pd.concat([df1, df2], join='inner', axis=1) 
Out[57]: 
    x y y z 
b 2 4 1 9 
c 3 5 3 8 
d 4 6 5 7 
e 5 7 7 6 

Nối theo chiều dọc (DEFAULT: axis = 0), sử dụng cột được tìm thấy trong cả hai DF:

In [58]: pd.concat([df1, df2], join='inner') 
Out[58]: 
    y 
a 3 
b 4 
c 5 
d 6 
e 7 
b 1 
c 3 
d 5 
e 7 
f 9 

Nếu bạn không sử dụng inner tham gia phương pháp - bạn sẽ có nó theo cách này:

In [62]: pd.concat([df1, df2]) 
Out[62]: 
    x y z 
a 1.0 3 NaN 
b 2.0 4 NaN 
c 3.0 5 NaN 
d 4.0 6 NaN 
e 5.0 7 NaN 
b NaN 1 9.0 
c NaN 3 8.0 
d NaN 5 7.0 
e NaN 7 6.0 
f NaN 9 5.0 

In [63]: pd.concat([df1, df2], axis=1) 
Out[63]: 
    x y y z 
a 1.0 3.0 NaN NaN 
b 2.0 4.0 1.0 9.0 
c 3.0 5.0 3.0 8.0 
d 4.0 6.0 5.0 7.0 
e 5.0 7.0 7.0 6.0 
f NaN NaN 9.0 5.0 
0

Thứ nhất, OP hiểu lầm các hàng và cột trong/dataframe mình.

Nhưng sản lượng acutal coi hàng được tìm thấy trong cả hai dataframes. (Chỉ chung yếu tố hàng 'y')

OP nghĩ nhãn y là cho hàng. Tuy nhiên, y là tên cột.

df1 = pd.DataFrame(
     {"x":[1, 2, 3, 4, 5], # <-- looks like row x but actually col x 
      "y":[3, 4, 5, 6, 7]}, # <-- looks like row y but actually col y 
      index=['a', 'b', 'c', 'd', 'e']) 
print(df1) 

      \col x y 
index or row\ 
      a  1  3 | a 
      b  2  4 v x 
      c  3  5 r i 
      d  4  6 o s 
      e  5  7 w 0 

       -> column 
       a x i s 1 

Nó là rất dễ dàng để bị lừa vì trong từ điển, nó trông giống như yx là hai hàng.

Nếu bạn tạo df1 từ một danh sách các danh sách, nó phải là trực quan hơn:

df1 = pd.DataFrame([[1,3], 
        [2,4], 
        [3,5], 
        [4,6], 
        [5,7]], 
        index=['a', 'b', 'c', 'd', 'e'], columns=["x", "y"]) 

Vì vậy, trở lại vấn đề, concat là viết tắt của concatenate (có nghĩa là để liên kết với nhau trong một loạt hoặc chuỗi trên đường này [source]) Thực hiện concatcùng trục 0 có nghĩa là liên kết hai đối tượng cùng trục 0.

1 
    1 <-- series 1 
    1 
^^^ 
| | |    1 
c a a    1 
o l x    1 
n o i gives you 2 
c n s    2 
a g 0    2 
t | | 
| V V 
v 
    2 
    2 <--- series 2 
    2 

Vì vậy ... nghĩ rằng bạn có cảm giác ngay bây giờ. Còn chức năng sum trong gấu trúc thì sao? sum(axis=0) có nghĩa là gì?

dữ liệu Giả sử trông giống như

1 2 
    1 2 
    1 2 

... Có lẽ cách tổng hợp cùng trục 0, bạn có thể đoán. Vâng!!

^^^ 
| | |    
s a a    
u l x     
m o i gives you two values 3 6 ! 
| n s    
v g 0    
    | | 
    V V 

Điều gì về dropna? Giả sử bạn có dữ liệu

1 2 NaN 
    NaN 3 5 
    2 4 6 

và bạn chỉ muốn giữ

2 
3 
4 

Trên giấy tờ, nó nói đối tượng Return với nhãn trên trục được bỏ qua nơi luân phiên bất kỳ hoặc tất cả các dữ liệu bị thiếu

Nếu bạn đặt dropna(axis=0) hoặc dropna(axis=1)? Hãy suy nghĩ về nó và thử nó ra với

df = pd.DataFrame([[1, 2, np.nan], 
        [np.nan, 3, 5], 
        [2, 4, 6]]) 

# df.dropna(axis=0) or df.dropna(axis=1) ? 

Gợi ý: suy nghĩ về lời cùng.

Các vấn đề liên quan