Как я могу выполнить итерацию по фрейму данных pandas, чтобы я мог разделить определенные значения на основе условия?

#python #pandas

#python #pandas

Вопрос:

У меня есть фрейм данных, как показано ниже:

           0       1       2   ...      62      63   64
795     89.0    92.0    89.0  ...    74.0    64.0  4.0
575     80.0    75.0    78.0  ...    70.0    68.0  3.0
1119  2694.0  2437.0  2227.0  ...  4004.0  4010.0  6.0
777     90.0    88.0    88.0  ...    71.0    67.0  4.0
506     82.0    73.0    77.0  ...    69.0    64.0  2.0
...      ...     ...     ...  ...     ...     ...  ...
65      84.0    77.0    78.0  ...    78.0    80.0  0.0
1368  4021.0  3999.0  4064.0  ...     1.0  4094.0  8.0
1036    80.0    80.0    79.0  ...    73.0    66.0  5.0
1391  3894.0  3915.0  3973.0  ...     4.0  4090.0  8.0
345     81.0    74.0    75.0  ...    80.0    75.0  1.0
 

Я хочу разделить все элементы более 1000 в этом фрейме данных на 100. Так 4021.0 становится 40.21 и так далее.

Я пробовал что-то вроде приведенного ниже:

 for cols in df:
    for rows in df[cols]:
        print(df[cols][rows])
 

Я получаю индекс из связанных ошибок. Я просто не уверен, как правильно выполнить итерацию так, как я ищу.

Ответ №1:

Я думаю, что циклы здесь медленные, поэтому лучше использовать решения для векторизации — выбирать значения, которые больше нравятся 1000 , и делить:

 df[df.gt(1000)] = df.div(100)
 

Или с помощью DataFrame.mask :

 df = df.mask(df.gt(1000), df.div(100))
 

 print (df)
     0      1      2     62     63   64
795   89.00  92.00  89.00  74.00  64.00  4.0
575   80.00  75.00  78.00  70.00  68.00  3.0
1119  26.94  24.37  22.27  40.04  40.10  6.0
777   90.00  88.00  88.00  71.00  67.00  4.0
506   82.00  73.00  77.00  69.00  64.00  2.0
65    84.00  77.00  78.00  78.00  80.00  0.0
1368  40.21  39.99  40.64   1.00  40.94  8.0
1036  80.00  80.00  79.00  73.00  66.00  5.0
1391  38.94  39.15  39.73   4.00  40.90  8.0
345   81.00  74.00  75.00  80.00  75.00  1.0
 

Ответ №2:

Вы можете использовать функцию applymap и создать свою пользовательскую функцию

 def mapper_function(x):
    if x >= 1000:
        x=x/100
        
    else:
       x
 return x

df=df.applymap(mapper_function)