При первой попытке я хочу создать DataFrame, но забыл указать некоторые значения:
a=[0,1/4,2/4,3/4,4]
b=[0,1/4,2/4,3/4,4]
z=DataFrame(index=a,columns=b)
Тогда я получил это.
> 0.00 0.25 0.50 0.75 4.00
> 0.00 NaN NaN NaN NaN NaN
> 0.25 NaN NaN NaN NaN NaN
> 0.50 NaN NaN NaN NaN NaN
> 0.75 NaN NaN NaN NaN NaN
> 4.00 NaN NaN NaN NaN NaN
Я хочу заменить все значения на np.arange(25).reshape(5,5)
Затем я попробовал это:
z.values=np.arange(25).reshape(5,5)
Результат:
object.setattr(self, name, value)
AttributeError: can't set attribute
Я имею в виду, что я мог бы воссоздать DataFrame со значениями в нем, но это кажется очень .... (не знаю, как сказать).
Вопрос:
1/Почему я не могу этого сделать?
2/Как это решить?
3/При условии, что я хочу, чтобы каждое значение z.values
было результатом умножения столбцов и строк (строки * столбцы). Как мне это сделать ?
Ожидаемый результат 3/
0.00 0.25 0.50 0.75 4.00
0.00 0 0 0 0 0
0.25 0 0.0625 0.125 0.1875 1
0.50 0 0.125 0.25 0.375 2
0.75 0 0.1875 0.375 0.5625 3
4.00 0 1 2 3 16
@Amazing Things Around You значения (строка * столбцы). приятель !
Но вы показали это: np.arange(25).reshape(5,5)
Я знаю, я имею в виду, на всякий случай, как я могу сделать это легко?
Вы имели в виду что-то вроде того, что я обновил в ответе?
Абсолютно, спасибо дружище!
Вы можете принять ответ, если он сработал
Давайте продолжить обсуждение в чате.
Попробуй это:
>>> import pandas as pd
>>> df = pd.DataFrame(np.arange(25).reshape(5,5))
>>> df
0 1 2 3 4
0 0 1 2 3 4
1 5 6 7 8 9
2 10 11 12 13 14
3 15 16 17 18 19
4 20 21 22 23 24
>>> a=[0,1/4,2/4,3/4,4]
>>> b=[0,1/4,2/4,3/4,4]
>>> df.columns = a
>>> df.index = b
>>> df
0.00 0.25 0.50 0.75 4.00
0.00 0 1 2 3 4
0.25 5 6 7 8 9
0.50 10 11 12 13 14
0.75 15 16 17 18 19
4.00 20 21 22 23 24
ОБНОВЛЕНО
Немного легкого:
>>> df = pd.DataFrame(np.arange(25).reshape(5,5),index=a,columns=b)
>>> df
0.00 0.25 0.50 0.75 4.00
0.00 0 1 2 3 4
0.25 5 6 7 8 9
0.50 10 11 12 13 14
0.75 15 16 17 18 19
4.00 20 21 22 23 24
Если я сначала создам DataFrame без значений, могу ли я добавить к нему значения позже, как я просил? @Удивительные вещи вокруг вас
Итак, вы хотите сначала создать фрейм данных. Но вы должны помнить об индексе, а затем заполнять в нем соответствующие значения. Позвольте мне редактировать
Используйте pd.DataFrame.where
один из способов:
import numpy as np
import pandas as pd
a=[0,1/4,2/4,3/4,4]
b=[0,1/4,2/4,3/4,4]
z=pd.DataFrame(index=a,columns=b)
z.where(pd.notna,np.arange(25).reshape(5,5))
Выход:
0.00 0.25 0.50 0.75 4.00
0.00 0 1 2 3 4
0.25 5 6 7 8 9
0.50 10 11 12 13 14
0.75 15 16 17 18 19
4.00 20 21 22 23 24
Для последнего используйте np.matmul
:
mat = np.matmul(np.reshape(z.index, (-1,1)), np.reshape(z.columns, (1,-1)))
z.where(pd.notna, mat)
Выход:
0.00 0.25 0.50 0.75 4.00
0.00 0 0 0 0 0
0.25 0 0.0625 0.125 0.1875 1
0.50 0 0.125 0.25 0.375 2
0.75 0 0.1875 0.375 0.5625 3
4.00 0 1 2 3 16
>>> z
0.00 0.25 0.50 0.75 4.00
0.00 NaN NaN NaN NaN NaN
0.25 NaN NaN NaN NaN NaN
0.50 NaN NaN NaN NaN NaN
0.75 NaN NaN NaN NaN NaN
4.00 NaN NaN NaN NaN NaN
>>> def cross_mul(x):
... return x.index * x.name
...
>>> z.apply(cross_mul)
0.00 0.25 0.50 0.75 4.00
0.00 0.0 0.0000 0.000 0.0000 0.0
0.25 0.0 0.0625 0.125 0.1875 1.0
0.50 0.0 0.1250 0.250 0.3750 2.0
0.75 0.0 0.1875 0.375 0.5625 3.0
4.00 0.0 1.0000 2.000 3.0000 16.0
>>> z.apply(lambda x: x.index * x.name) // One Liner
Спасибо, @ChauLoi. Если вы сочтете это полезным, пожалуйста, примите мой ответ, нажав на галочку.
Какой результат вы ожидаете? Пожалуйста, дайте мне знать. Кстати, что вы подразумеваете под своим третьим пунктом?