我试图将每两列除以数据集中的最后两列。例如,我想将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
也就是说,我想通过将每个国家/地区的值除以其人口来创建一个新的数据框(保留原始列标签)。 手动为每一列执行此操作会占用真实数据集太多时间,而且我无法弄清楚如何运行循环。
有人可以帮忙吗? 非常感谢!
答案 0 :(得分:1)
如果更改原始组织,则可以更轻松地完成此操作,但是从这一点出发,最好只使用一些逻辑来确定前缀,然后对每个子组进行除法,然后将结果与{{1} }。
concat
答案 1 :(得分:1)
您可以使用df.columns
和slicing
来选择适合您的用例的列
设置数据框
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