这是一个使用 pandas 的多索引和广播的解决方案。多索引将国家和指标放在两个单独的列标签级别。广播可让您将每个德国(或法国)指标除以德国(或法国)人口。
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