Python 如何在多列数据帧中迭代每个单独的列值?

Python 如何在多列数据帧中迭代每个单独的列值?,python,pandas,dataframe,Python,Pandas,Dataframe,我有多列数据框,其中列[“国家”、“能源供应”、“人均能源供应”、“可再生能源”] 在“能源供应”列中,我想将该列的单位从千兆转换为Peta。但在这个过程中 energy['energy Supply']*=energy['energy Supply'],当值类似“…”(缺少的值用此表示)时,也会被乘以或说是重复。此外,列中的字符串值也在成倍增加。(例如,原件:Peta,操作后:Peta…) 为了防止这种情况发生,我正在运行以下程序: energy = pd.read_excel("Energy

我有多列数据框,其中列[“国家”、“能源供应”、“人均能源供应”、“可再生能源”]

在“能源供应”列中,我想将该列的单位从千兆转换为Peta。但在这个过程中
energy['energy Supply']*=energy['energy Supply']
,当值类似“…”(缺少的值用此表示)时,也会被乘以或说是重复。此外,列中的字符串值也在成倍增加。(例如,原件:Peta,操作后:Peta…)

为了防止这种情况发生,我正在运行以下程序:

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条件,因为前两行是“字符串”,基于此,程序不会修改值,而我想单独检查值是否为整数类型,如果是,则将数字乘以1000000

输入:

    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

这为我带来了无数的价值:

import pandas as pd
import numpy as np 

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

energy = pd.DataFrame(data)
输入:

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]
然后将序列转换为数组并设置值:

arr = energy["Energy Supply"].values

for i in range(len(arr)):
    if isinstance(arr[i],int):
        arr[i] = arr[i]*1000000
    else:
        pass
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
输出如下所示:

        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]
但您也可以在使用pd.to_numeric()后简单地执行此操作:

可以使用检查字符串是否为数字,然后进行乘法

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

请提供输入和期望输出的示例。您能提供一些输入数据和期望输出吗?您可以阅读@JohnZwinck,请检查,我做了必要的更改,我尝试运行此<代码>属性错误:“Series”对象没有属性“is\u integer”。我认为is_integer在这方面不起作用。我尝试了
energy['energy Supply']=np.where(isinstance(energy['energy Supply',int),energy['energy Supply']*1000000,energy['energy Supply')
,但是仍然没有发生任何事情。您可以使用
。where
方法执行相同的操作吗?只有删除字符串值时才可能执行此操作,如果字符串值不包含任何可以删除的信息,则可以删除字符串值。感谢您的回复,但尝试此代码时,会显示int对象没有属性名称“isnumeric”,
AttributeError:“int”对象没有属性“isnumeric”
。对此有什么想法吗?非常感谢,它现在正在发挥作用,但是你能解释一下为什么另一个答案(在这篇文章上)不起作用,而你所做的却起作用。据我所知,您正在遍历列并将所有值转换为字符串,然后检查字符串是数字还是数字not@Sajal我认为没有一种称为
is\u integer()
的方法可用于字符串。其中as
Series.str.isnumeric
检查序列中的每一行是否有数字,如果找到,则相应地将其相乘。
energy["Energy Supply"] = energy["Energy Supply"]*1000000
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