Найти cumprod для фрейма данных?

#python #pandas #dataframe #numpy

Вопрос:

У меня есть (треугольный)фрейм данных i,e:DF1:

 2016A   NaN NaN  2.5  6.5  NaN  NaN
2016B   NaN 5.32 6.3  NaN  NaN  NaN
2017A   NaN 9.4  5.6  NaN  NaN  NaN
2018B   4.5 NaN  5.6  NaN  NaN  NaN
2018C   NaN 6.5  4.3  NaN  NaN  NaN
2019A   5.3 NaN  NaN  NaN  NaN  NaN
 

Я должен найти cumprod для этого фрейма данных.

Я попробовал этот код:

 df2= df1.iloc[:, ::-1].cumprod(axis=1).iloc[:, ::-1]
 

Но результат такой же, как df1

Результат должен выглядеть так:

 2016A   NaN NaN   16.25  6.5  NaN   NaN
2016B   NaN 33.51  6.3   NaN  NaN   NaN
2017A   NaN 52.64  5.6   NaN  NaN   NaN
2018B   25.2 NaN   5.6   NaN  NaN   NaN
2018C   NaN 27.95  4.3   NaN  NaN   NaN
2019A   5.3  NaN   NaN   NaN  NaN   NaN
 

Спасибо, что уделили мне время 🙂

Комментарии:

1. Ваш код работает хорошо, не так ли?

2. Есть какая-то ошибка?

3. У меня нет имени столбца или имени строки во фрейме данных :

4. ошибка выглядит так :ошибка типа: не удается умножить последовательность на не-int типа ‘float’

5. Что такое print (df.head(2).to_dict()) ?

Ответ №1:

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

 >>> df.set_index(df.iloc[:, 0].name).iloc[:, ::-1].cumprod(axis=1).iloc[:, ::-1].reset_index()
       0     1       2      3    4   5   6
0  2016A   NaN     NaN  16.25  6.5 NaN NaN
1  2016B   NaN  33.516   6.30  NaN NaN NaN
2  2017A   NaN  52.640   5.60  NaN NaN NaN
3  2018B  25.2     NaN   5.60  NaN NaN NaN
4  2018C   NaN  27.950   4.30  NaN NaN NaN
5  2019A   5.3     NaN    NaN  NaN NaN NaN
>>> 
 

Комментарии:

1. Я думаю, что это индекс.

2. это не работает, показывает эту ошибку:ошибка типа: не удается умножить последовательность на не-int типа ‘float’

3. @MichaelScofield Что df.dtypes выводит?

Ответ №2:

ПРАВКА1:

Первое использование header=None для предотвращения преобразования первой строки данных в имена столбцов:

 df1 = pd.read_excel(file, header=None)
 

Существует один или несколько нечисловых столбцов, вы можете найти их по:

 print (df1.select_dtypes(exclude=np.number).columns)
 

Если все столбцы должны быть числовыми, исключите 0, col1, col2 использование:

 df1 = df1.set_index([0, 'col1','col2']).apply(pd.to_numeric, errors='coerce')
 

А затем используйте свое решение:

 df2 = df1.iloc[:, ::-1].cumprod(axis=1).iloc[:, ::-1]
 

Если первый столбец не является индексом:

 lens = len(df1.columns)
df1.update(df1.iloc[:, lens:0:-1].cumprod(axis=1).iloc[:, lens:0:-1])
print (df1)
       0     1       2      3    4   5   6
0  2016A   NaN     NaN  16.25  6.5 NaN NaN
1  2016B   NaN  33.516   6.30  NaN NaN NaN
2  2017A   NaN  52.640   5.60  NaN NaN NaN
3  2018B  25.2     NaN   5.60  NaN NaN NaN
4  2018C   NaN  27.950   4.30  NaN NaN NaN
5  2019A   5.3     NaN    NaN  NaN NaN NaN
 

Или создайте index сначала по первому столбцу:

 df1 = df1.set_index(df1.columns[0])
df2 = df1.iloc[:, ::-1].cumprod(axis=1).iloc[:, ::-1]