2016-08-01 3 views
1

У меня есть dataframe, который содержит: TIMESTAMP, P_ACT_KW и P_SOUSCR.Добавление нового столбца для подстроки: Длина значений не соответствует длине индекса

df2 = pd.read_csv('C:/Users/Demonstrator/Downloads/power.csv',delimiter=';') 

Во-первых, я бросил недостающие наблюдения:

df_no_missing = df2.dropna() 

Затем я пытаюсь добавить новый столбец с именем depassement, который содержит значение 0 if(df2['P_ACT_KW'] - df2['P_SOUSCR']) < 0 else df2['P_ACT_KW']- df2['P_SOUSCR'].

df_no_missing['depassement'] = np.where((df_no_missing['P_SOUSCR'] - df_no_missing['P_ACT_KW']) < 0), 0, df_no_missing['P_ACT_KW'] - df_no_missing['P_SOUSCR'] 

Но я получаю эту ошибку:

 
ValueError         
Traceback (most recent call last) in() 
----> 1 df_no_missing['depassement'] = np.where((df_no_missing['P_SOUSCR'] - df_no_missing['P_ACT_KW']) 2357    self._set_item(key, value) 2358  2359  def _setitem_slice(self, key, value): 

C:\Users\Demonstrator\Anaconda3\lib\site-packages\pandas\core\frame.py in _set_item(self, key, value) 2421  2422   self._ensure_valid_index(value) 
-> 2423   value = self._sanitize_column(key, value) 2424   NDFrame._set_item(self, key, value) 2425 

C:\Users\Demonstrator\Anaconda3\lib\site-packages\pandas\core\frame.py in _sanitize_column(self, key, value) 2576  2577    # turn me into an ndarray 
-> 2578    value = _sanitize_index(value, self.index, copy=False) 2579    if not isinstance(value, (np.ndarray, Index)): 2580     if isinstance(value, list) and len(value) > 0: 

C:\Users\Demonstrator\Anaconda3\lib\site-packages\pandas\core\series.py in _sanitize_index(data, index, copy) 2768  2769  if len(data) != len(index): 
-> 2770   raise ValueError('Length of values does not match length of ' 'index') 2771  2772  if isinstance(data, PeriodIndex): 

ValueError: Length of values does not match length of index 

Любая идея, пожалуйста, чтобы решить эту проблему?

+1

Похоже, потребность 'df_no_missing [ 'depassement'] = np.where ((df_no_missing ['P_SOUSCR'] - df_no_missing ['P_ACT_KW']) <0, 0, df_no_missing ['P_ACT_KW'] - df_no_missing ['P_SOUSCR']) ', конечная скобка была добавлена, а другая удалена. – jezrael

+0

@jezrael большое спасибо, Когда я добавляю parenthese, я получил это предупреждающее сообщение: «C: \ Users \ Demonstrator \ Anaconda3 \ lib \ site-packages \ ipykernel \ __ main__.py:1: SettingWithCopyWarning: Значение пытаясь быть установленным на копии среза из DataFrame. Попробуйте использовать .loc [row_indexer, col_indexer] = значение вместо См. оговорки в документации: http://pandas.pydata.org/pandas-docs/ stable/indexing.html # indexing-view-versus-copy if __name__ == '__main__': " – Bio

+1

Когда у вас есть большое сообщение трассировки, форматирование его как кода лучше для чтения, потому что цитирование обертывает текст (это невозможно впоследствии исправить это). Можете ли вы опубликовать трассировку, завернутую в '

' and '
', пожалуйста? – ayhan

ответ

0

Вы можете добавить параметр inplace=True в df2 для INPLACE удаления NaN и правильные скобки:

import pandas as pd 
import numpy as np 

df2 = pd.DataFrame({'P_SOUSCR':[10,2,1,np.nan], 
        'P_ACT_KW':[4,5,6,4]}) 

df2.dropna(inplace=True) 
print (df2) 
    P_ACT_KW P_SOUSCR 
0   4  10.0 
1   5  2.0 
2   6  1.0 

df2['depassement'] = np.where((df2['P_SOUSCR'] - df2['P_ACT_KW']) < 0, 
           0, 
           df2['P_ACT_KW'] - df2['P_SOUSCR']) 
print (df2) 
    P_ACT_KW P_SOUSCR depassement 
0   4  10.0   -6.0 
1   5  2.0   0.0 
2   6  1.0   0.0 

Другим решением является добавление copy:

df_no_missing = df2.dropna().copy() 
+0

Спасибо, он работает! – Bio

Смежные вопросы