【问题标题】:How to iterate over each individual column values in multiple column dataframe?如何迭代多列数据框中的每个单独的列值?
【发布时间】:2019-03-25 13:48:02
【问题描述】:

我有多列数据框,其中包含 ['Country', 'Energy Supply', 'Energy Supply per Capita', '% Renewable']

在能源供应列中,我想将列的单位从 Giga 转换为 Peta。但在这个过程中 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

【问题讨论】:

标签: python pandas dataframe


【解决方案1】:

这对我有用一百万个值:

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]

然后我将 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]

如果将系列转换为数字,则字符串值将变为 nan 值。使用 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

【讨论】:

  • 我试图运行它。 AttributeError: 'Series' object has no attribute 'is_integer'。我不认为 is_integer 可以解决这个问题。
  • 我试过energy['Energy Supply'] = np.where(isinstance(energy['Energy Supply'],int), energy['Energy Supply']*1000000, energy['Energy Supply']),但仍然没有任何反应
  • 你能用.where方法做同样的事情吗?
  • 只有当你删除字符串值时才有可能,如果它们不包含你可以删除的信息。
【解决方案2】:

您可以使用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

【讨论】:

  • 感谢您的回复,但是在尝试此代码时,它显示 int 对象没有属性名称 'isnumeric',AttributeError: 'int' object has no attribute 'isnumeric'。对此有任何想法吗?
  • 非常感谢,它现在可以工作了,但是你能解释一下为什么另一个答案(在这篇文章中)没有工作,你所做的工作正在工作。据我所知,您正在遍历列并将所有值转换为字符串,然后检查字符串是否为数字
  • @Sajal 我认为没有一种名为is_integer() 的方法可用于字符串。其中Series.str.isnumeric 检查系列中的每一行是否有数字,如果找到则相应地乘以。
猜你喜欢
  • 1970-01-01
  • 2018-08-22
  • 1970-01-01
  • 2014-11-25
  • 2023-01-14
  • 2022-07-05
  • 2019-07-05
  • 2016-12-03
  • 2022-11-18
相关资源
最近更新 更多