遍历熊猫中的列

时间:2020-10-14 15:34:57

标签: pandas loops indexing

我试图将每两列除以数据集中的最后两列。例如,我想将column [0]和column [2]除以column [-2],然后将结果分别存储在column [0]和column [2]中。

理想情况下,我想要从中获得

   fra1  ger1   fra2  ger2  fra pop  ger pop
0    12    14    525    52       14       14

类似这样的东西:

           fra1          ger1          fra2          ger2  
0    12/fra pop    14/ger pop   525/fra pop    52/ger pop

也就是说,我想通过将每个国家/地区的值除以其人口来创建一个新的数据框(保留原始列标签)。 手动为每一列执行此操作会占用真实数据集太多时间,而且我无法弄清楚如何运行循环。

有人可以帮忙吗? 非常感谢!

4 个答案:

答案 0 :(得分:1)

如果更改原始组织,则可以更轻松地完成此操作,但是从这一点出发,最好只使用一些逻辑来确定前缀,然后对每个子组进行除法,然后将结果与{{1} }。

concat

答案 1 :(得分:1)

您可以使用df.columnsslicing来选择适合您的用例的列

设置数据框

import pandas as pd
import io

t = '''
   fra1  ger1   fra2  ger2  fra pop  ger pop
0    12    14    525    52       14       14'''
df = pd.read_csv(io.StringIO(t), sep='\s\s+', engine='python')
df

出局:

   fra1  ger1  fra2  ger2  fra pop  ger pop
0    12    14   525    52       14       14

要针对实际数据调整列名所依据的切片[:4] [-2:]和乘法因子2

df[df.columns[:4]].div(df[df.columns[-2:].tolist()*2].values)

出局:

       fra1  ger1  fra2      ger2
0  0.857143   1.0  37.5  3.714286

答案 2 :(得分:0)

我想我也找到了解决方法:

divisor = df.iloc[:,-2:]
for index, column in enumerate(df):
    values = df[column]
    if index < 2:
        num1 = values
        df[column] = num1/divisor.iloc[:,index]
    if 1 < index < 3:
        num2 = values
        df[column] = num2/divisor.iloc[:,index-2]

答案 3 :(得分:0)

这里是使用熊猫的多索引和广播的解决方案。多重索引将国家和指标置于列标签的两个单独的级别中。通过广播,您可以将每个德国(或法国)指标除以德国(或法国)人口。

from io import StringIO
import pandas as pd

# add 2nd row to validate results below
t = '''
   fra1  ger1   fra2  ger2  fra pop  ger pop
0    12    14    525    52       14       14
1     2    3       4     5        6        7
'''
df = pd.read_csv(StringIO(t), sep='\s\s+', engine='python')

# create hierarchical index (i.e., multi-index)
midx = [('france', 'm1'), ('germany', 'm2'),
        ('france', 'm2'), ('germany', 'm2'),
        ('france', 'pop'), ('germany', 'pop')]
midx = pd.MultiIndex.from_tuples(midx, names=['country', 'metric'])
df.columns = midx

# create `metrics` data frame (excludes population)
metrics = df.loc[:, (slice(None), ['m1', 'm2'])]

# create population data frame (and remove one level of index)
pop = df.loc[:, (slice(None), 'pop')].droplevel(level='metric', axis=1)

result = metrics.div(pop, level='country')
print(result)

country    france   germany     france   germany
metric         m1        m2         m2        m2
0        0.857143  1.000000  37.500000  3.714286
1        0.333333  0.428571   0.666667  0.714286

此处有更多信息:https://pandas.pydata.org/pandas-docs/stable/user_guide/advanced.html