Pandas ValueError: Форма переданных значений (6, 3), индексы подразумевают (6, 4) - PullRequest
0 голосов
/ 02 мая 2018

В следующем коде python я пытаюсь добавить три новых столбца в Pandas dataframe, обрабатывая данные из других столбцов.

import pandas as pd

class MyClass:
    def __init__(self):
        pass

    def foo( self, a, b, c, d ):
        print 'A: ', a,' B: ', b, ' C: ', c, ' D: ', d
        return 0.0, 0.0 


if __name__=="__main__":
    myClass = MyClass()

    def bar(row):    
        b =  row['B']
        c = row['C']
        d = row['D']
        a = row['A']
        e, f = myClass.foo( a, b, c, d ) 
        return e, f, e + f 

    df = pd.DataFrame({
                'A':  [1522083365352316, 1522089025972228, 1522091257321565, 1522253707450381, 1522267174827558, 1522342541329606],
                'B':       [     'X',            'X',            'Y',        'Y',            'X',            'X'      ],  
                'C':        [      100,              100,               150,             50,               100,               57       ],
                'D': [     26.11,            26.1,              26.2,            26.2,             26.06,             26.09     ]
                 })

    df['A'] = pd.to_datetime(df['A'], unit = 'us')
    #print df
    df['E'], df['F'], df['G'] = zip(*df.apply(bar, axis = 1))
    print df

При запуске я получаю следующую ошибку.

Traceback (most recent call last):
  File "LifoPnLDebug.py", line 32, in <module>
    df['E'], df['F'], df['G'] = zip(*df.apply(bar, axis = 1))
  File "/usr/lib64/python2.7/site-packages/pandas/core/frame.py", line 4877, in apply
    ignore_failures=ignore_failures)
  File "/usr/lib64/python2.7/site-packages/pandas/core/frame.py", line 4990, in _apply_standard
    result = self._constructor(data=results, index=index)
  File "/usr/lib64/python2.7/site-packages/pandas/core/frame.py", line 330, in __init__
    mgr = self._init_dict(data, index, columns, dtype=dtype)
  File "/usr/lib64/python2.7/site-packages/pandas/core/frame.py", line 461, in _init_dict
    return _arrays_to_mgr(arrays, data_names, index, columns, dtype=dtype)
  File "/usr/lib64/python2.7/site-packages/pandas/core/frame.py", line 6173, in _arrays_to_mgr
    return create_block_manager_from_arrays(arrays, arr_names, axes)
  File "/usr/lib64/python2.7/site-packages/pandas/core/internals.py", line 4642, in create_block_manager_from_arrays
    construction_error(len(arrays), arrays[0].shape, axes, e)
  File "/usr/lib64/python2.7/site-packages/pandas/core/internals.py", line 4608, in construction_error
    passed, implied))
ValueError: Shape of passed values is (6, 3), indices imply (6, 4)

Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

Измените функцию bar следующим образом -

def bar(row):    
        b =  row['B']
        c = row['C']
        d = row['D']
        a = row['A']

        e, f = myClass.foo( a, b, c, d ) 
        row['E'] = e
        row['F'] = f
        row['G'] = e+f
        return row

А потом назови это так -

df = df.apply(bar, axis = 1)

выход

                           A  B    C      D    E    F    G
0 2018-03-26 16:56:05.352316  X  100  26.11  0.0  0.0  0.0
1 2018-03-26 18:30:25.972228  X  100  26.10  0.0  0.0  0.0
2 2018-03-26 19:07:37.321565  Y  150  26.20  0.0  0.0  0.0
3 2018-03-28 16:15:07.450381  Y   50  26.20  0.0  0.0  0.0
4 2018-03-28 19:59:34.827558  X  100  26.06  0.0  0.0  0.0
5 2018-03-29 16:55:41.329606  X   57  26.09  0.0  0.0  0.0
0 голосов
/ 02 мая 2018

Если вы хотите добавить только столбцы из этой функции, вы можете напрямую применить df['E'], df['F'], df['G'] = bar(df) И вы получите вывод, как показано ниже: A B C D E F G 0 2018-03-26 16:56:05.352316 X 100 26.11 0.0 0.0 0.0 1 2018-03-26 18:30:25.972228 X 100 26.10 0.0 0.0 0.0 2 2018-03-26 19:07:37.321565 Y 150 26.20 0.0 0.0 0.0 3 2018-03-28 16:15:07.450381 Y 50 26.20 0.0 0.0 0.0 4 2018-03-28 19:59:34.827558 X 100 26.06 0.0 0.0 0.0 5 2018-03-29 16:55:41.329606 X 57 26.09 0.0 0.0 0.0

Вам не нужно использовать функцию apply для этого ... посмотреть, если это то, что вы ищете ....

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...