Pandas concat: ValueError: Форма переданих значень бла, індекси означають blah2


85

Я намагаюся об'єднати (Pandas 14.1) фрейм даних та серію. Серія повинна утворювати новий стовпець з деякими NA (оскільки значення індексу серії є підмножиною значень індексу кадру даних).

Це працює для прикладу іграшок, але не з моїми даними (детально нижче).

Приклад:

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

Ситуація з даними (див. Нижче) здається в основному ідентичною - поєднання серії із DatetimeIndex, значення якої є підмножиною фреймів даних. Але це дає ValueError у заголовку (blah1 = (5, 286) blah2 = (5, 276)). Чому це не працює ?:

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
Ви пробували appendзамість concat? І якщо я ValueErrorправильно розумію, це означає, що є 286 рядків даних, але індекси кадру даних очікують 276 рядків. Спробуйте перевірити len(df.index)і len(h1.index).
заспокоєння

df.append (hl) не працює з TypeError: об'єкт 'NoneType' не підлягає ітерації. Але потім я спробував приєднатися - спасибі! :)
birone

Нема проблем. Обов’язково позначте свою відповідь як правильну, щоб майбутні користувачі SO могли швидко знайти ваше рішення, якщо у них буде схожа проблема.
заспокоєння

Зроби ... коли це дозволить.
birone

4
Повідомлення про помилку може бути набагато кориснішим, наприклад, можливо, сказати "у вас, мабуть, є дублікати індексів" ...
wordsforthewise

Відповіді:


74

У мене була подібна проблема ( joinпрацювала, але concatне вдалося).

Перевірте наявність повторюваних значень індексу в df1і s1, (наприклад df1.index.is_unique)

Видалення повторюваних значень індексу (наприклад, df.drop_duplicates(inplace=True)) або одного із методів тут https://stackoverflow.com/a/34297689/7163376 має вирішити це.


3
Це спрацювало, дякую! Я роблю це так: df = pd.concat ([df1, df2], ось = 1, join_axes = [df1.index]). Якщо у мене є перевертання в df2, тоді я отримую цю помилку. Має сенс, оскільки він не знає, як зіставити кілька повторюваних індексів в обох DF.
горобець

2
Щоб скинути дублікати індексів, використовуйте df = df.loc[df.index.drop_duplicates()]. Cf pandas.pydata.org/pandas-docs/stable/generated / ...
BallpointBen

3
Пропозиція перевірити наявність дублікатів значень індексу в обох індексах, ймовірно, допоможе багатьом людям, які читають це питання
dsugasa,

Щоб видалити повторювані індекси, найкраще можна df = df[~df.index.duplicated(keep='first')]побачити stackoverflow.com/questions/13035764 / ...
ZTL

29

Моєю проблемою були різні індекси, наступний код вирішив мою проблему.

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

2
Ви забулиinplace=True
Алаа М.

У мене виникла ця проблема, і reset_index () вирішив її. У чому була проблема в оригінальному індексі та як вирішив reset_index ()?
рубпа

5

Щоб скинути дублікати індексів, використовуйте df = df.loc[df.index.drop_duplicates()]. Cf pandas.pydata.org/pandas-docs/stable/generated / ... - BallpointBen 18 Квітня о 15:25

Це неправильно, але я не можу відповісти безпосередньо на коментар BallpointBen через низьку репутацію. Причиною його помилки є те, що df.index.drop_duplicates()повертає список унікальних індексів, але коли ви індексуєте назад у фрейм даних, використовуючи ці унікальні індекси, він все одно повертає всі записи. Я думаю, що це цілком ймовірно, оскільки індексація за допомогою одного з продубльованих індексів поверне всі екземпляри індексу.

Натомість використовуйте df.index.duplicated(), що повертає логічний список (додайте, ~щоб отримати недубльовані записи):

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

3

Пост Aus_lacy дав мені ідею спробувати пов'язані методи, з яких join працює:

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

Деяке розуміння того, чому concat працює на прикладі, але не ці дані було б непогано!


3

Ваші індекси, ймовірно, містять дубльовані значення.

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))


0

Можливо, це просто, спробуйте це, якщо у вас є DataFrame. тоді переконайтеся, що обидві матриці або векторні елементи, які ви намагаєтесь об’єднати, мають однакові імена рядків / індекс

У мене була та сама проблема. Я змінив індекси імен рядків, щоб вони збігалися між собою. Ось приклад для матриці (основний компонент) і вектор (ціль) мають однакові індикатори рядків (я обвів їх синім у лівій частині картинки)

Раніше, "коли він не працював", у мене була матриця з нормальними індексами рядків (0,1,2,3), тоді як у мене був вектор з індексами рядків (ID0, ID1, ID2, ID3), тоді я змінив рядок вектора індекси до (0,1,2,3), і це у мене спрацювало.

введіть тут опис зображення


Не могли б ви показати це у формі коду?
WBM
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.