Длина значений не соответствует длине индекса для точно такой же длины индекса и значений - PullRequest
1 голос
/ 01 апреля 2020

У меня есть простой набор данных с равной длиной значений и индекса, но я получаю ошибку значения. Вчера все работало нормально, но я добавил ошибки, когда я добавил последнюю строку.

df={"date":[2018,2019],'x1': [1, 2], 'x2': [3, 4], 'y1': [8, 6],'y2': [7, 8], 'y3': [9, 2]} 
df=pd.DataFrame(data=df)
baseyear=min(df["date"])
df["t"]=df["date"]-baseyear+1
df['date'] = pd.to_datetime(df['date'], format='%Y').dt.year
df.set_index('date',inplace=True)
col=df.columns.to_list()
df[sq+"sq"]=[0.5*(df[sq]**2) for sq in col]
df[sq+"t"]=[(df[sq]*df["t"] if sq !="t" else df["t"]) for sq in col]

1 Ответ

1 голос
/ 01 апреля 2020

Я думаю, что вы можете обработать все столбцы вместе, DataFrame.add_suffix и добавить к оригиналу с помощью DataFrame.join, для второго аналогичная идея с удалить t:

df = df.join((0.5*(df[col]**2)).add_suffix('sq'))

df = df.join(df[col.difference(['t'])].mul(df["t"], axis=0).add_suffix('t'))
#last added tt column same like t
df['tt'] = df['t']

print (df)
      x1  x2  y1  y2  y3  t  x1sq  x2sq  y1sq  y2sq  y3sq  tsq  x1t  x2t  y1t  \
date                                                                            
2018   1   3   8   7   9  1   0.5   4.5  32.0  24.5  40.5  0.5    1    3    8   
2019   2   4   6   8   2  2   2.0   8.0  18.0  32.0   2.0  2.0    4    8   12   

      y2t  y3t  tt  
date                
2018    7    9   1  
2019   16    4   2  

Ваше решение должно работать с циклами, но если производительность многих столбцов должна быть хуже:

col=df.columns.to_list()

for sq in col:
    df[sq+"sq"]= 0.5*(df[sq]**2)
for sq in col:
    df[sq+"t"]= (df[sq]*df["t"] if sq !="t" else df["t"])

print (df)
      x1  x2  y1  y2  y3  t  x1sq  x2sq  y1sq  y2sq  y3sq  tsq  x1t  x2t  y1t  \
date                                                                            
2018   1   3   8   7   9  1   0.5   4.5  32.0  24.5  40.5  0.5    1    3    8   
2019   2   4   6   8   2  2   2.0   8.0  18.0  32.0   2.0  2.0    4    8   12   

      y2t  y3t  tt  
date                
2018    7    9   1  
2019   16    4   2  

РЕДАКТИРОВАТЬ: Решение для нескольких по комбинации столбцов:

from  itertools import combinations


df={"date":[2018,2019],'x1': [1, 2], 'x2': [3, 4], 'y1': [8, 6],'y2': [7, 8], 'y3': [9, 2]} 
df=pd.DataFrame(data=df)
baseyear=min(df["date"])
df["t"]=df["date"]-baseyear+1
df['date'] = pd.to_datetime(df['date'], format='%Y').dt.year
df.set_index('date',inplace=True)

col = df.columns
col_without_t = col.difference(['t'])


df1 = df.join((0.5*(df[col]**2)).add_suffix('sq'))

df1 = df1.join(df1[col_without_t].mul(df1["t"], axis=0).add_suffix('t'))
df1['tt'] = df1['t']


cc = list(combinations(col,2))
#if want columns without t
#cc = list(combinations(col_without_t,2))
df2 = pd.concat([df[c[1]].mul(df[c[0]]) for c in cc], axis=1, keys=cc) 
df2.columns = df2.columns.map(''.join)

df = df.join(df2)

print (df)
      x1  x2  y1  y2  y3  t  x1x2  x1y1  x1y2  x1y3  ...  x2y1  x2y2  x2y3  \
date                                                 ...                     
2018   1   3   8   7   9  1     3     8     7     9  ...    24    21    27   
2019   2   4   6   8   2  2     8    12    16     4  ...    24    32     8   

      x2t  y1y2  y1y3  y1t  y2y3  y2t  y3t  
date                                        
2018    3    56    72    8    63    7    9  
2019    8    48    12   12    16   16    4  

[2 rows x 21 columns]
...