Python датафрейм заменяет последние n строк списком из n элементов - PullRequest
2 голосов
/ 19 апреля 2020

У меня есть фрейм данных 2500 строк. Я пытаюсь заменить последние n строк данных со списком из n элементов. Я привожу пример моей проблемы и того, что я хотел

df = 
      A
0    10.5
1    10.5
2    10.5
3    10.5
4    10.5
5    10.5
6    10.5

Мой новый список содержит два элемента, которые должны быть размещены в двух нижних строках.

op_res = [20.5, 30.5]

Мой код и текущий вывод:

df.loc[-2:,'A'] = pd.Series(op_res)
df = 
      A
0    10.5
1    10.5
2    10.5
3    10.5
4    10.5
5    nan
6    nan

Что может быть не так в моем коде? Мой код и настоящий вывод:

df = 
      A
0    10.5
1    10.5
2    10.5
3    10.5
4    10.5
5    20.5
6    30.5

Ответы [ 2 ]

2 голосов
/ 19 апреля 2020

IIU C

df.A.to_numpy()[-2:]=op_res
df
      A
0  10.5
1  10.5
2  10.5
3  10.5
4  10.5
5  20.5
6  30.5

Проблема в вашем коде: индекс не совпадает, поэтому при его возврате он вернет nan, поскольку pandas assign будет соответствовать индексу как всегда

pd.Series(op_res)
0    20.5
1    30.5
dtype: float64

Индекс из оригинала df

df.iloc[-2:,0] 
5    10.5
6    10.5
Name: A, dtype: float64

Сверху мы знаем, что индекс [0,1] не может совпадать с индексом [5,6], поэтому все присвоенные значения вернут nan.

2 голосов
/ 19 апреля 2020

Мы можем использовать DataFrame.iloc и транслировать список в массив с помощью numpy.array:

df.iloc[-len(op_res):] = np.array(op_res)[:, None]


      A
0  10.5
1  10.5
2  10.5
3  10.5
4  10.5
5  20.5
6  30.5

или с помощью DataFrame.append:

df.iloc[:-len(op_res)].append(pd.DataFrame({'A': op_res}), ignore_index=True)

      A
0  10.5
1  10.5
2  10.5
3  10.5
4  10.5
5  20.5
6  30.5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...