Pandas concat: ValueError: Hình dạng của các giá trị được truyền là blah, các chỉ số ngụ ý blah2


85

Tôi đang cố gắng hợp nhất khung dữ liệu (Pandas 14.1) và một chuỗi. Chuỗi sẽ tạo thành một cột mới, với một số NA (vì các giá trị chỉ mục của chuỗi là tập hợp con của các giá trị chỉ mục của khung dữ liệu).

Điều này hoạt động với một ví dụ đồ chơi, nhưng không phù hợp với dữ liệu của tôi (chi tiết bên dưới).

Thí dụ:

import pandas as pd
import numpy as np

df1 = pd.DataFrame(np.random.randn(6, 4), columns=['A', 'B', 'C', 'D'], index=pd.date_range('1/1/2011', periods=6, freq='D'))
df1

A   B   C   D
2011-01-01  -0.487926   0.439190    0.194810    0.333896
2011-01-02  1.708024    0.237587    -0.958100   1.418285
2011-01-03  -1.228805   1.266068    -1.755050   -1.476395
2011-01-04  -0.554705   1.342504    0.245934    0.955521
2011-01-05  -0.351260   -0.798270   0.820535    -0.597322
2011-01-06  0.132924    0.501027    -1.139487   1.107873

s1 = pd.Series(np.random.randn(3), name='foo', index=pd.date_range('1/1/2011', periods=3, freq='2D'))
s1

2011-01-01   -1.660578
2011-01-03   -0.209688
2011-01-05    0.546146
Freq: 2D, Name: foo, dtype: float64

pd.concat([df1, s1],axis=1)

A   B   C   D   foo
2011-01-01  -0.487926   0.439190    0.194810    0.333896    -1.660578
2011-01-02  1.708024    0.237587    -0.958100   1.418285    NaN
2011-01-03  -1.228805   1.266068    -1.755050   -1.476395   -0.209688
2011-01-04  -0.554705   1.342504    0.245934    0.955521    NaN
2011-01-05  -0.351260   -0.798270   0.820535    -0.597322   0.546146
2011-01-06  0.132924    0.501027    -1.139487   1.107873    NaN

Tình huống với dữ liệu (xem bên dưới) về cơ bản có vẻ giống hệt nhau - nối một chuỗi với DatetimeIndex có các giá trị là một tập con của khung dữ liệu. Nhưng nó đưa ra ValueError trong tiêu đề (blah1 = (5, 286) blah2 = (5, 276)). Tại sao nó không hoạt động ?:

In[187]: df.head()
Out[188]:
high    low loc_h   loc_l
time                
2014-01-01 17:00:00 1.376235    1.375945    1.376235    1.375945
2014-01-01 17:01:00 1.376005    1.375775    NaN NaN
2014-01-01 17:02:00 1.375795    1.375445    NaN 1.375445
2014-01-01 17:03:00 1.375625    1.375515    NaN NaN
2014-01-01 17:04:00 1.375585    1.375585    NaN NaN
In [186]: df.index
Out[186]:
<class 'pandas.tseries.index.DatetimeIndex'>
[2014-01-01 17:00:00, ..., 2014-01-01 21:30:00]
Length: 271, Freq: None, Timezone: None

In [189]: hl.head()
Out[189]:
2014-01-01 17:00:00    1.376090
2014-01-01 17:02:00    1.375445
2014-01-01 17:05:00    1.376195
2014-01-01 17:10:00    1.375385
2014-01-01 17:12:00    1.376115
dtype: float64

In [187]:hl.index
Out[187]:
<class 'pandas.tseries.index.DatetimeIndex'>
[2014-01-01 17:00:00, ..., 2014-01-01 21:30:00]
Length: 89, Freq: None, Timezone: None

In: pd.concat([df, hl], axis=1)
Out: [stack trace] ValueError: Shape of passed values is (5, 286), indices imply (5, 276)

2
Bạn đã thử appendthay vì concat? Và nếu tôi hiểu ValueErrorđúng thì nó nói rằng có 286 hàng dữ liệu, nhưng các chỉ số của khung dữ liệu đang mong đợi 276 hàng. Hãy thử kiểm tra len(df.index)len(h1.index).
alacy,

df.append (hl) không thành công với TypeError: Đối tượng 'NoneType' không thể lặp lại. Nhưng sau đó tôi đã thử tham gia - cảm ơn! :)
birone.

Không vấn đề gì. Đảm bảo đánh dấu câu trả lời của bạn là đúng để người dùng SO trong tương lai có thể nhanh chóng tìm ra giải pháp của bạn nếu họ gặp vấn đề tương tự.
alacy,

Sẽ làm ... khi nó cho phép tôi.
birone,

4
Các thông báo lỗi có thể là rất nhiều hữu ích hơn, như có thể nói rằng "bạn có thể có một số chỉ số trùng lặp" ...
wordsforthewise

Câu trả lời:


74

Tôi đã gặp sự cố tương tự ( joinđã hoạt động, nhưng concatkhông thành công).

Kiểm tra các giá trị chỉ mục trùng lặp trong df1s1, (ví dụ:df1.index.is_unique )

Xóa các giá trị chỉ mục trùng lặp (ví dụ df.drop_duplicates(inplace=True):) hoặc một trong các phương pháp tại đây https://stackoverflow.com/a/34297689/7163376 sẽ giải quyết được vấn đề này.


3
Cảm ơn! Tôi đang làm như thế này: df = pd.concat ([df1, df2], axis = 1, join_axes = [df1.index]). Nếu tôi có lỗi trong df2 thì tôi gặp lỗi này. Có nghĩa là nó không biết cách ánh xạ nhiều chỉ mục trùng lặp trên cả hai DF.
sparrow

2
Để loại bỏ các chỉ số trùng lặp, hãy sử dụng df = df.loc[df.index.drop_duplicates()]. Cf pandas.pydata.org/pandas-docs/stable/generated/…
BallpointBen

3
Đề xuất kiểm tra các giá trị chỉ mục trùng lặp trong cả hai chỉ số có thể sẽ giúp ích cho nhiều người khi đọc câu hỏi này
dsugasa

Để giảm các chỉ số trùng lặp, tốt nhất có thể df = df[~df.index.duplicated(keep='first')]xem stackoverflow.com/questions/13035764/…
ztl,

29

Vấn đề của tôi là các chỉ số khác nhau, đoạn mã sau đã giải quyết được vấn đề của tôi.

df1.reset_index(drop=True, inplace=True)
df2.reset_index(drop=True, inplace=True)
df = pd.concat([df1, df2], axis=1)

2
Bạn đã quêninplace=True
Alaa M.

Tôi đã kết thúc với sự cố này và reset_index () đã giải quyết nó. Vấn đề trong chỉ mục gốc là gì và reset_index () đã giải quyết nó như thế nào?
rubpa

5

Để loại bỏ các chỉ số trùng lặp, hãy sử dụng df = df.loc[df.index.drop_duplicates()]. Cf pandas.pydata.org/pandas-docs/stable/generated/… - BallpointBen ngày 18 tháng 4 lúc 15:25

Điều này là sai nhưng tôi không thể trả lời trực tiếp bình luận của BallpointBen do uy tín thấp. Lý do sai lầm của nó làdf.index.drop_duplicates() trả về danh sách các chỉ số duy nhất, nhưng khi bạn lập chỉ mục trở lại khung dữ liệu bằng cách sử dụng các chỉ số duy nhất đó, nó vẫn trả về tất cả các bản ghi. Tôi nghĩ điều này có thể xảy ra bởi vì việc lập chỉ mục bằng cách sử dụng một trong các chỉ số trùng lặp sẽ trả về tất cả các bản sao của chỉ mục.

Thay vào đó, hãy sử dụng df.index.duplicated(), trả về một danh sách boolean (thêm vào ~để lấy các bản ghi không bị trùng lặp):

df = df.loc[~df.index.duplicated()]

3

Bài đăng của Aus_lacy đã cho tôi ý tưởng thử các phương pháp liên quan, trong đó phép nối hoạt động:

In [196]:

hl.name = 'hl'
Out[196]:
'hl'
In [199]:

df.join(hl).head(4)
Out[199]:
high    low loc_h   loc_l   hl
2014-01-01 17:00:00 1.376235    1.375945    1.376235    1.375945    1.376090
2014-01-01 17:01:00 1.376005    1.375775    NaN NaN NaN
2014-01-01 17:02:00 1.375795    1.375445    NaN 1.375445    1.375445
2014-01-01 17:03:00 1.375625    1.375515    NaN NaN NaN

Một số thông tin chi tiết về lý do tại sao concat hoạt động trên ví dụ nhưng không phải dữ liệu này sẽ tốt!


3

Chỉ mục của bạn có thể chứa các giá trị trùng lặp.

import pandas as pd

T1_INDEX = [
    0,
    1,  # <= !!! if I write e.g.: "0" here then it fails
    0.2,
]
T1_COLUMNS = [
    'A', 'B', 'C', 'D'
]
T1 = [
    [1.0, 1.1, 1.2, 1.3],
    [2.0, 2.1, 2.2, 2.3],
    [3.0, 3.1, 3.2, 3.3],
]

T2_INDEX = [
    1.2,
    2.11,
]

T2_COLUMNS = [
    'D', 'E', 'F',
]
T2 = [
    [54.0, 5324.1, 3234.2],
    [55.0, 14.5324, 2324.2],
    # [3.0, 3.1, 3.2],
]
df1 = pd.DataFrame(T1, columns=T1_COLUMNS, index=T1_INDEX)
df2 = pd.DataFrame(T2, columns=T2_COLUMNS, index=T2_INDEX)


print(pd.concat([pd.DataFrame({})] + [df2, df1], axis=1))

1

Hãy thử sắp xếp chỉ mục sau khi nối chúng

result=pd.concat([df1,df2]).sort_index()

0

Có thể nó đơn giản, hãy thử điều này nếu bạn có DataFrame. sau đó đảm bảo rằng cả hai ma trận hoặc vecto mà bạn đang cố gắng kết hợp có cùng tên hàng / chỉ mục

Tôi gặp vấn đề tương tự. Tôi đã thay đổi chỉ số tên của các hàng để làm cho chúng khớp với nhau. Đây là một ví dụ cho một ma trận (thành phần chính) và một vectơ (đích) có cùng các chỉ báo hàng (tôi đã khoanh tròn chúng bằng màu xanh lam ở bên trái của pic)

Trước đây, "khi nó không hoạt động", tôi có ma trận với các chỉ báo hàng bình thường (0,1,2,3) trong khi tôi có vectơ có chỉ số hàng (ID0, ID1, ID2, ID3) sau đó tôi đã thay đổi hàng của vectơ chỉ số đến (0,1,2,3) và nó phù hợp với tôi.

nhập mô tả hình ảnh ở đây


Bạn có thể hiển thị điều này ở dạng mã không?
WBM
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.