Как перебрать значения каждого отдельного столбца в нескольких столбцах данных? - PullRequest
0 голосов
/ 21 октября 2018

У меня есть несколько столбцов данных с колонками [«Страна», «Энергоснабжение», «Энергоснабжение на душу населения», «% возобновляемых источников»] .

В энергоснабжениистолбец, я хочу преобразовать единицу столбца в Пета из гига.Но в процессе energy['Energy Supply']*= energy['Energy Supply'], когда значение равно «....» (пропущенное значение обозначается этим), оно также умножается или, скажем, дублируется.Кроме того, значение строки в столбце также умножается.(Например, оригинал: Peta, после операции: PetaPetaPetaPeta ...).

Чтобы не допустить этого, я запускаю это:

energy = pd.read_excel("Energy Indicators.xls",skiprows = 16, skip_footer = 38)
energy.drop(['Unnamed: 0','Unnamed: 1'],axis = 1, inplace = True)
energy.columns = ['Country', 'Energy Supply', 'Energy Supply per Capita', '% Renewable']
for i in energy['Energy Supply']:
    if (isinstance(energy[i],int) == True):
        energy['Energy Supply'][i]=energy['Energy Supply'][i]*1000000
return (energy)

Но я не получаю результат, т.е.изменить значение только переменных целочисленного типа, и ничего не изменится.

Там, где, я думаю, заключается проблема, первые две строки дадут условие false , как и первые строки "Строка "и, исходя из этого, программа не изменяет значения, в то время как я хочу индивидуально проверить, имеет ли значение целочисленный тип, и, если это так, умножает число на 1 000 000.

Вход:

    Country        Energy Supply    Energy Supply per Capita    % Renewable
0   NaN             Petajoules            Gigajoules                 %
1   Afghanistan        321                   10                  78.6693
2   Albania            102                   35                    100
3   Algeria            1959                  51                  0.55101
4   American Samoa      ...                 ...                  0.641026

Ожидаемый выход:

    Country        Energy Supply    Energy Supply per Capita    % Renewable
0   NaN             Petajoules            Gigajoules                 %
1   Afghanistan        3210000                10                     78.6693
2   Albania            1020000                35                      100
3   Algeria            19590000               51                     0.55101
4   American Samoa      ...                 ...                    0.641026

Токовый выход:

    Country        Energy Supply    Energy Supply per Capita    % Renewable
0   NaN             PetajoulesPeta.         Gigajoules               %
1   Afghanistan        3210000                10                   78.6693
2   Albania            1020000                35                    100
3   Algeria            19590000               51                   0.55101
4   American Samoa      ........                ...                0.641026

Ответы [ 2 ]

0 голосов
/ 21 октября 2018

Вы можете использовать str.isnumeric, чтобы проверить, является ли строка числовой, а затем умножить.

energy['Energy Supply'] = energy['Energy Supply'].apply(lambda x: int(x) * 1000000 if str(x).isnumeric() else x)

print (energy)

    Country         Energy Supply   Energy Supply per Capita    % Renewable
0             NaN    Petajoules           Gigajoules                     %
1     Afghanistan    321000000                10                   78.6693
2         Albania    102000000                35                       100
3         Algeria    1959000000               51                   0.55101 
4  American Samoa        ...                  ..                  0.641026
0 голосов
/ 21 октября 2018

Это сработало для меня с миллионными значениями:

import pandas as pd
import numpy as np 

data = {"Energy Supply":[1,30,"Petajoules",5,70]*2000000}

energy = pd.DataFrame(data)

input:

Energy Supply
0                   1
1                  30
2          Petajoules
3                   5
4                  70
5                   1
6                  30
7          Petajoules
8                   5
9                  70
10                  1
11                 30
12         Petajoules
13                  5
14                 70
15                  1
16                 30
17         Petajoules
18                  5
19                 70
20                  1
21                 30
22         Petajoules
23                  5
24                 70
25                  1
26                 30
27         Petajoules
28                  5
29                 70
              ...
[10000000 rows x 1 columns]

Затем я преобразовываю Series в массив и устанавливаю значения:

arr = energy["Energy Supply"].values

for i in range(len(arr)):
    if isinstance(arr[i],int):
        arr[i] = arr[i]*1000000
    else:
        pass

Вывод выглядит следующим образом:

        Energy Supply
0             1000000
1            30000000
2          Petajoules
3             5000000
4            70000000
5             1000000
6            30000000
7          Petajoules
8             5000000
9            70000000
10            1000000
11           30000000
12         Petajoules
13            5000000
14           70000000
15            1000000
16           30000000
17         Petajoules
18            5000000
19           70000000
20            1000000
21           30000000
22         Petajoules
23            5000000
24           70000000
25            1000000
26           30000000
27         Petajoules
28            5000000
29           70000000
              ...
[10000000 rows x 1 columns]

Это решение примерно в два раза быстрее, чем приложение:

Цикл по массиву:

loop: 100%|██████████| 10000000/10000000 [00:07<00:00, 1376439.75it/s]

Использование Применить:

apply: 100%|██████████| 10000000/10000000 [00:14<00:00, 687420.00it/s]

Если вы преобразуете серию в числовую, то строковые значения становятся значениями нан.При использовании np.where вам потребуется около 5 секунд для преобразования ряда в числовое значение и умножения значений:

import pandas as pd
import numpy as np 
import time

data = {"Energy Supply":[1,30,"Petajoules",5,70]*2000000}

energy = pd.DataFrame(data)
t = time.time()

energy["Energy Supply"] = pd.to_numeric(energy["Energy Supply"],errors="coerce")

energy["Energy_Supply"] = np.where((energy["Energy Supply"]%1==0),energy["Energy Supply"]*100,energy["Energy Supply"])
t1 = time.time()
print(t1-t)
5.275099515914917

Но вы также можете просто сделать это после использования pd.to_numeric ():

energy["Energy Supply"] = energy["Energy Supply"]*1000000
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...