неполная математическая операция в двух столбцах с использованием interrows() в panda

#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. Зачем вы это делаете?