2017-08-22 14 views
2

とデータフレームに毎年の比率を計算します。たとえばパイソン/パンダ - 動的に私はこのデータフレーム持っている今年の列名

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氏は、同じ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']の動的な方法でこれを作ることに役立つことはできますか?

+1

年が列であるようにデータを再構成することを検討してください。次に 'groupby()' 'Co_name'と' year'を呼び出し、各グループにあなたの関数(例えば 'profit/revenue')を適用します。 –

答えて

4

確かに、あなたは、一致する列を見つけ、それらに式を適用することができます。

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])] 

このソリューションでは、それぞれの「収益」列に一致する「利益」欄があることを前提としています。そうでない場合は、「利益」年のセットと「収入」年のセットを取得し、その交差点を取得します。

2
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) 
関連する問題