#python #pandas #for-loop #subtraction
#python #pandas #for-цикл #вычитание
Вопрос:
Привет, я пытаюсь вычесть данные 2 столбцов из фрейма данных и поместить их в новый фрейм данных. Я использую цикл for в interrows(). Однако цикл не завершает все вычисления, поскольку размер строки меньше, чем столбцов. В будущем столбец будет увеличиваться, поэтому я использую цикл вместо имени столбца. Есть ли какой-либо или альтернативный способ выполнить это вычисление.
name col1 col2 col3 col4 col5 col6 col7 col8
John 0 23 0 1 4 1 5 23
1 victor 1 4 5 2 1 4 2 15
2 Alida 1 1 2 6 0 2 14 2
3 Natalie 0 1 1 4 2 3 4 4
4 Morman 3 3 1 0 5 2 0 1
Я попытался запустить следующий код :
for label, row in df.iterrows():
df2.iloc[:,[label 2]]=df.iloc[:,[label 2]].values-df.iloc[:,[label 1]].values
Однако цикл не выполняется после col6. я предполагаю, что это из-за того, что количество строк меньше, чем столбцов.
результат:
name col1 col2 col3 col4 col5 col6 col7 col8
0 John 0 23 -23 1 3 -3 5 23
1 victor 1 3 1 -3 -1 3 2 15
2 Alida 1 0 1 4 -6 2 14 2
3 Natalie 0 1 0 3 -2 1 4 4
4 Morman 3 0 -2 -1 5 -3 0 1
есть ли способ запустить цикл, пока он не пройдет через весь столбец?
Комментарии:
1. Можете ли вы объяснить, что вы хотите видеть в качестве результата? Кроме того, когда вы выполняете итерацию с
iterrows
, label будет индексом строки, но вы используете его как индекс столбца с iloc. Кроме того,iterrows
это очень медленно, поэтому, если вы дадите больше объяснений о том, что вы пытаетесь сделать, мы могли бы найти для вас лучшую функцию для использования. Хотя я не уверен, что вы пытаетесь получить, похоже, вы можете захотеть взглянуть на использованиеdiff
метода, и, возможно, потребуется предварительно перенести ваш фрейм данных.2. Я хочу увидеть для col7 = разница col7 amp; col6. Есть ли какая-либо другая функция, которая будет выполнять вычисления во всех значениях dataframe. Я пытался использовать label в col, но это не работает. @teepee
3. теперь имеет смысл; см. Мой ответ ниже
Ответ №1:
если вы хотите вычесть два специальных столбца, скажем, col1 и col2, используйте это:
import numpy as np
import pandas as pd
data = {"name":["john","victor","alida","natalie","morman"],"col1":[0,1,2,3,4],"col2":[5,6,7,8,9],"col3":[0,1,2,3,4],"col4":[5,6,7,8,9],"col5":[0,1,2,3,4],"col6":[5,6,7,8,9],"col7":[0,1,2,3,4]}
df = pd.DataFrame(data=data)
print(df)
new_df = pd.DataFrame()
new_df["new_col"] = df["col1"] - df["col2"]
print(new_df)
если вы хотите, например, вычесть каждый столбец из соседнего, используйте это:
cols = df.columns
for i in range(2,len(cols)-1):
new_df["new_" cols[i]] = df[cols[i]]-df[cols[i-1]]
print(new_df)
Комментарии:
1. Столбец Dataframe будет увеличиваться в будущем . Я думаю, что он был удален, когда я отправлял вопрос, поэтому я хочу использовать значение индекса вместо имени столбца.
2. вам не нужно выполнять цикл здесь; есть встроенный метод,
diff
который делает это.
Ответ №2:
Вы можете использовать diff
метод для вашего фрейма данных, чтобы вычесть каждый столбец из соседнего. Например:
df.set_index('name').diff(axis=1)
Это устанавливает ваш столбец name в качестве индекса строки, а затем выполняет вычитания для каждого столбца из следующего столбца. Как вы упомянули, на выходе будет на один столбец меньше, поэтому результирующий col1 будет NaNs .
Комментарии:
1. Привет, это можно обойти. Но что, если мне нужно вычесть значения из двух разных столбцов фрейма данных, где строка Поэтому я хочу использовать индекс для указания значения.
2. не уверен, что вы имеете в виду, где строка <столбец? Количество строк меньше количества столбцов? Я не понимаю, почему это может быть проблемой; можете ли вы объяснить на примере?
3. когда я использую for label, строка в df.iterrows(): label принимает значение размера строки фрейма данных, которое равно 5. Но мой текущий фрейм данных имеет 9 столбцов (в будущем это увеличится). Из-за этого цикл будет выполняться только 5 раз, что означает, что вычисление будет происходить только до col6. amp; хотите, чтобы цикл пути проходил через весь столбец.
4. Зачем вы это делаете?