#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]