Почему метод pandas dataframe describe().min возвращает стандартное отклонение вместо этого?

#python #pandas #dataframe

#python #pandas #dataframe

Вопрос:

Я пытаюсь вычесть минимальное значение каждого столбца из всех значений в этом столбце в pandas dataframe. Но при использовании df.describe().min[columnName] для получения минимального значения этого столбца он возвращает минимальные значения правильно, за исключением последнего столбца, похоже, вместо этого он возвращает стандартное отклонение. Вот пример:

 import pandas as pd
import numpy as np

# create dictionary and dataframe
dfDict = {'A': [1,2,3,4], 'B':[2,4,6,8],'C': [3,5,7,9]}
df = pd.DataFrame.from_dict(dfDict)
  
 print(df)
  

вывод:

    A  B  C
0  1  2  3
1  2  4  5
2  3  6  7
3  4  8  9
  

Когда мне print(df.describe()) кажется, что это значение в порядке, вывод:

               A         B         C
count  4.000000  4.000000  4.000000
mean   2.500000  5.000000  6.000000
std    1.290994  2.581989  2.581989
min    1.000000  2.000000  3.000000
25%    1.750000  3.500000  4.500000
50%    2.500000  5.000000  6.000000
75%    3.250000  6.500000  7.500000
max    4.000000  8.000000  9.000000
  

Но когда я print(df.describe().min()) , значение для C не является минимальным значением, а скорее стандартным отклонением, я получаю этот вывод:

 A    1.000000
B    2.000000
C    2.581989
dtype: float64
  

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

 iterColNames = df.columns.tolist()
for colName in iterColNames:
    df[colName] = df[colName]-df.describe().min()[colName]

  

Это приводит к хорошим значениям для первых двух столбцов, но не для последнего.
Если я print(df) сейчас, это дает мне такой результат:

      A    B         C
0  0.0  0.0  0.418011
1  1.0  2.0  2.418011
2  2.0  4.0  4.418011
3  3.0  6.0  6.418011
  

Где вместо этого он должен выдать мне следующий вывод:

      A    B    C
0  0.0  0.0  0.0
1  1.0  2.0  2.0
2  2.0  4.0  4.0
3  3.0  6.0  6.0
  

Это кажется довольно простым, но я не уверен, в чем причина этой проблемы.
Ценю вашу помощь!

Ответ №1:

 print(df.describe().min())
  

вычислит минимальные значения для (псевдо-) df.describe() возвращаемого фрейма данных, что, вероятно, не имеет особого смысла.

Вместо этого просто

 >>> df.min()
A    1
B    2
C    3
  

вернет минимумы по столбцам.

Ответ №2:

Это даст вам результат, который вы ищете:

 df - df.min()

    A   B   C
0   0   0   0
1   1   2   2
2   2   4   4
3   3   6   6
  

df.min() вычисляет минимум для каждого столбца. И когда вы вычитаете этот минимум из вашего df, pandas вычтет его из каждого значения в столбце. Нет необходимости использовать циклы for . Старайтесь избегать циклов for при использовании pandas. Pandas использует векторизованные операции, в целом они намного быстрее.

Ответ №3:

В качестве дополнения к другим ответам, которые, как правило, являются лучшими решениями вашего вопроса:

Если вы хотите выбрать определенную строку по индексу в фрейме данных, например df.describe() , вы можете использовать loc

 df.describe().loc['min']
  

Out:

 A    1.0
B    2.0
C    3.0
Name: min, dtype: float64
  

Чтобы получить желаемый результат

 df - df.describe().loc['min']
  

Out:

      A    B    C
0  0.0  0.0  0.0
1  1.0  2.0  2.0
2  2.0  4.0  4.0
3  3.0  6.0  6.0