Python 使用for循环生成数据帧

Python 使用for循环生成数据帧,python,pandas,dataframe,for-loop,filter,Python,Pandas,Dataframe,For Loop,Filter,我已经生成了一个数据框(称为“部门”),用于存储我的经纪账户中的信息(部门/行业、子部门、公司名称、当前价值、成本基础等) 我希望避免为每个部门或子部门硬编码过滤器以查找特定数据。我通过以下代码实现了这一点(我知道,不是很pythonic,但我对编码是新手): 我的打印报表生成了我想要的大部分信息,尽管我仍在研究如何为自己部门内的子部门的%进行编程。无论如何,我现在想把这些信息(value_in_sect,pct_in_sect,等等)放到它们自己的数据帧中。什么是最好的方式、最聪明的方式或最有

我已经生成了一个数据框(称为“部门”),用于存储我的经纪账户中的信息(部门/行业、子部门、公司名称、当前价值、成本基础等)

我希望避免为每个部门或子部门硬编码过滤器以查找特定数据。我通过以下代码实现了这一点(我知道,不是很pythonic,但我对编码是新手):

我的打印报表生成了我想要的大部分信息,尽管我仍在研究如何为自己部门内的子部门的%进行编程。无论如何,我现在想把这些信息(value_in_sect,pct_in_sect,等等)放到它们自己的数据帧中。什么是最好的方式、最聪明的方式或最有吸引力的方式?我正在考虑一个字典,然后从字典中创建一个数据帧,但不确定。

具体来说,在
pandas
中创建数据帧是最好的方法。首先,我将解释这个过程将如何手动工作,然后我将展示pandas如何在一行中完成

手动拆分应用联合收割机 分裂 首先,将数据帧划分为相同扇区的组。这涉及到获取一个扇区列表并确定哪些行属于它(就像代码的前两行一样)。此代码在数据帧中运行,并构建一个字典,其中键作为扇区,以及与之对应的
扇区的行索引列表

sections_index={}
对于ix,扇区_df.ItErrors()中的行:
如果第[‘扇区’]行不在扇区索引中:
扇区索引[第['扇区]]=[ix]行
其他:
扇区索引[第['扇区]]行。追加(ix)
申请 在本例中,对每组运行相同的函数,求当前值的和,并计算其百分比份额。也就是说,对于每个扇区,从数据帧中获取相应的行,并在代码的下一行中运行计算。我将把结果存储为一个字典字典:
{'Sector1':{'value_in_sect':1234.56,'pct_in_sect':11.11},'Sector2':…}
,原因稍后将变得显而易见:

sector_total_value={}
总价值=扇区价值[“当前价值”]。总和()
对于扇区,扇区索引中的行索引。\u index.items()
扇区_df=扇区_df.loc[行_指数]
当前值=扇区值df[“当前值”].sum()
扇区总值[扇区]={u扇区中的'value':四舍五入(当前值,2),
“截面中的pct”:四舍五入(当前值/总值*100,2)
}
(有关舍入的注释,请参见脚注1)

结合 最后,将函数结果收集到一个新的数据帧中,其中索引是扇区
pandas
可以轻松地将此嵌套字典结构转换为数据帧:

sector\u total\u value\u df=pd.DataFrame.from\u dict(sector\u total\u value,orient='index'))
使用
groupby
pandas
使用
groupby
方法使此过程非常简单

分裂
groupby
方法通过一列或多列(甚至其他系列)将数据帧拆分为多个组:

grouped\u by\u sector=sectors\u df.groupby('sector'))
按扇区分组
与我们之前构建的索引类似,但是可以更容易地操纵这些组,正如我们在下面的步骤中所看到的

申请 要计算每组中的总值,请选择要汇总的一列或多列,对要应用的函数使用
agg
aggregate
方法:

section_total_value=按_section['Current value']分组。agg(section中的值=sum)
结合 已经完成了!应用步骤已经创建了一个数据帧,其中索引是扇区(groupby列),sect
列中
value\u的值是
sum
操作的结果

我省略了章节
中的
pct\u部分,因为a)事后更容易完成:

section_total_value_df['pct_in_section']=四舍五入(section_total_value_df['value_in_section']/total_value*100,2)
扇区总值df[“扇区中的值”]=四舍五入(扇区总值df[“扇区中的值”],2)
b)这超出了这个答案的范围

其中大部分可以在一行中轻松完成(包括百分比和四舍五入,请参见脚注2):

section_total_value_df=sections_df.groupby('section')['Current value'].agg(sect中的值=sum)
对于子部门,还有一个额外的考虑因素,即分组应按部门和子部门进行,而不仅仅是子部门,这样,例如,公用事业/天然气和能源/天然气的行就不会合并

subsector_total_value_df=sections_df.groupby(['Sector','subsector'])['Current value'].agg(section中的值=sum)
这将生成一个数据帧,其中包含一个多索引,级别为“扇区”和“子扇区”,列为“分区中的值”。对于最后一个魔术,可以很容易地计算出扇区中的百分比:

subsector_total_value_df['pct_in_section']=round(subsector_total_value_df['value_in_section']/sector_total_value_df['value_in_section']*100,2)
这是因为“部门”指数水平在划分期间是匹配的

脚注1。这与您的代码略有不同,因为我选择使用未舍入的总值计算百分比,以最小化百分比中的错误。理想情况下,取整只在显示时进行

脚注2。此一行生成所需结果,包括百分比和舍入:

section_total_value_df=sections_df.groupby('section')['Current value'].agg(
第节中的值=λc:四舍五入(和(c),2),
pct_in_sect=lambda c:round(总和(c)/扇区_df[‘当前值’)。总和()*100,2),
)

熊猫。pivot\u table
是你的朋友。您可以按扇区和子扇区进行分组
for x in set(sectors_df['Sector']):
    x_filt = sectors_df['Sector'] == x
    #value in sect takes the sum of all current values in a given sector
    value_in_sect = round(sectors_df.loc[x_filt]['Current Value'].sum(), 2)
    #pct in sect is the % of the sector in the over all portfolio (total equals the total value of all sectors) 
    pct_in_sect = round((value_in_sect/total)*100 , 2)
    print(x, value_in_sect, pct_in_sect)

for sub in set(sectors_df['Sub Sector']):
    sub_filt = sectors_df['Sub Sector'] == sub
    value_of_subs = round(sectors_df.loc[sub_filt]['Current Value'].sum(), 2)
    pct_of_subs = round((value_of_subs/total)*100, 2)
    print(sub, value_of_subs, pct_of_subs)