Назначения с pd.DataFrame.loc - PullRequest
0 голосов
/ 14 мая 2018

Я работаю над фреймом данных df:

     0   1     2     3     4     5     6    7     
2  418  -5   -81   526   NaN   NaN   NaN  NaN   
5  415  -5  -116   487    -5   116   462  -24   
7  413  -5   -81   323   NaN   NaN   NaN  NaN

Я написал код, чтобы проверить, является ли column 4 нулевым.Если true, заполните 4, 5, 6, 7 значениями 0, 1, 2, 3 и добавьте 4 других столбца с такими же значениями.

rows = df.index
for i in rows1:
   if np.isnan(df.loc[i,4]):
       df.loc[i,4] = df.loc[i,0]
       df.loc[i,5] = df.loc[i,1]
       df.loc[i,6] = df.loc[i,2]
       df.loc[i,7] = df.loc[i,3]
       df.loc[i,8] = df.loc[i,0]
       df.loc[i,9] = df.loc[i,1]
       df.loc[i,10] = df.loc[i,2]
       df.loc[i,11] = df.loc[i,3]
df

Заданный и желаемый результат:

     0   1     2     3     4     5     6    7    8   9   10   11    
2  418  -5   -81   526   418    -5   -81  526  418  -5  -81  526 
5  415  -5  -116   487    -5   116   462  -24  NaN NaN  NaN  NaN
7  413  -5   -81   323   413    -5   -81  323  413  -5  -81  323

Мой вопрос: Как оптимизировать мой код, чтобы избежать повторения назначений.Я пытался

df.loc[i,4:7]=df.loc[i,0:3]
df.loc[i,8:11]=df.loc[i,0:3]

, но это не дает желаемого результата.

1 Ответ

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

Это один из способов векторизации вашей логики:

# create null test Boolean series & define replacement array
null_test = df[4].isnull()
arr = df.loc[null_test, [0, 1, 2, 3]].values

# update 4, 5, 6, 7
df.loc[null_test, [4, 5, 6, 7]] = arr

# add additional columns
df = df.join(pd.DataFrame(columns=[8, 9, 10, 11]))

# update 8, 9, 10, 11
df.loc[null_test, [8, 9, 10, 11]] = arr

print(df)

    0   1    2    3      4      5      6      7    8    9    10   11
2  418  -5  -81  526  418.0   -5.0  -81.0  526.0  418   -5  -81  526
5  415  -5 -116  487   -5.0  116.0  462.0  -24.0  NaN  NaN  NaN  NaN
7  413  -5  -81  323  413.0   -5.0  -81.0  323.0  413   -5  -81  323
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...