[英]Python / Pandas - Dynamically calculate yearly ratios in a dataframe with year column names
我有这个数据框:
df:
Co_Name . 2014 Revenues . Address . 2012 Profits . 2014 Profits...
1 . Apple 1231 Gjud St 20 23 ...
2 . Orange 84894 Uinjs St 712 313 ...
3 . Squirrel 9192 Iusaa St 4312 123 ...
...
例如:“ 2014年收入”代表某家公司在2014年的收入。
我需要计算不同的比率,使方程式具有同一年的值。 例如,我需要计算2014年的利润率,也就是说:
df['2014 ProfitMg'] = df['2014 Profits']/df['2014 Revenues']
但是,我有很多年和很多比例要从这个数据框(巨大的数据框)中取出,所以我想以一种动态的,Python的方式做到这一点。 我想说:“ Python先生,请为以相同的4个字符的字符串开头的名为'Profits'和'Revenues'的列计算利润/收入”或类似的内容。
它看起来应该像这样:
Co_Name . 2014 Revenues . Address . 2012 Profits . 2014 Profits . 2014 ProfitMg ...
1 . Apple 1231 Gjud St 20 23 0.019
2 . Orange 84894 Uinjs St 712 313 0.008
3 . Squirrel 9192 Iusaa St 4312 123 0.0133
...
有人可以动态地代替df['2014 ProfitMg'] = df['2014 Profits']/df['2014 Revenues']
吗?
当然,您可以找到匹配的列并将公式应用于它们:
import re
years = [re.findall(r"(\d{4})\sRevenues", col) for col in df.columns]
for year in years:
if year:
df['{} ProfitMg'.format(year[0])] = df['{} Profits'.format(year[0])]\
/ df['{} Revenues'.format(year[0])]
该解决方案假定每个“收入”列都有一个匹配的“利润”列。 如果不是,则获取“利润”年份的集合和“收入”年份的集合,并求交。
import pandas as pd
import numpy as np
# create some data
profit_nm = ['. '+str(i)+' Profits' for i in range(1951,2051)]
revenue_nm = ['. '+str(i)+' Revenues' for i in range(1951,2051)]
column_nm = profit_nm+revenue_nm
column_nm.sort()
data = np.asarray(np.random.randint(100,1000,size=(1000,200)))
df = pd.DataFrame(data,columns=column_nm)
# function that will return the ratios
def func(pd_series):
year = pd_series.name[:6]
ret = df.loc[:,year+' Profits']/df.loc[:,year+' Revenues']
return ret
# extract names of profit columns from dataframe
profit_cols = [i for i in df.columns.tolist() if i.find(' Profits')!=-1]
# get ratios and store in df
df2 = df.loc[:,profit_cols].apply(func, axis=0)
# change column names before joining as column names are same in df and df2
df2.columns = [year[:6]+' PftPct' for year in profit_cols]
df = df.join(df2)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.