Python 创建多个dataframe列,其中包含来自现有列的计算值
我有一个数据帧,Python 创建多个dataframe列,其中包含来自现有列的计算值,python,pandas,for-loop,dataframe,Python,Pandas,For Loop,Dataframe,我有一个数据帧,sega_df: Month 2016-11-01 2016-12-01 Character Sonic 12.0 3.0 Shadow 5.0 23.0 我想创建多个新列,方法是为我的dataframe中已经存在的每个列应用一个公式(简而言之,几乎是
sega_df
:
Month 2016-11-01 2016-12-01
Character
Sonic 12.0 3.0
Shadow 5.0 23.0
我想创建多个新列,方法是为我的dataframe中已经存在的每个列应用一个公式(简而言之,几乎是列数的两倍)。这个公式是(100-[5*eachcell])*0.2
例如,11月对于Sonic,(100-[5*12.0])*0.2=8.0
,12月对于Sonic,(100-[5*3.0])*0.2=17.0
我的理想输出是:
Month 2016-11-01 2016-12-01 Weighted_2016-11-01 Weighted_2016-12-01
Character
Sonic 12.0 3.0 8.0 17.0
Shadow 5.0 23.0 15.0 -3.0
我知道如何创建for循环来创建一列。如果只考虑了一个月,则为:
for w in range(1,len(sega_df.index)):
sega_df['Weighted'] = (100 - 5*sega_df)*0.2
sega_df[sega_df < 0] = 0
范围内的w(1,len(sega_df.index)):
世嘉测向[‘加权’]=(100-5*世嘉测向)*0.2
sega_-df[sega_-df<0]=0
我还没有获得创建多个专栏的技能或经验。我一直在寻找其他问题,这些问题可能会回答我到底在做什么,但还没有得到任何有效的答案。提前感谢。一种矢量化方法是淹没到
numpy
:
A = sega_df.values
A = (100 - 5*A) * 0.2
res = pd.DataFrame(A, index=sega_df.index, columns=('Weighted_'+sega_df.columns))
然后将结果连接到原始数据帧:
sega_df = sega_df.join(res)
这是可行的,除了
columns
参数抛出一个TypeError(必须是str,而不是DatetimeIndex
),因为从Excel中读取时,我的列实际上是DateTime
类型。目前正在努力正确分配列名并避免类似这样的错误。是的,如果要在列名前加前缀,可能需要在开始之前将它们都加上字符串。类似于df.columns=df.columns.map(str)
。您对将列标题转换为字符串有什么建议吗?@ia_-wing,是的,请参阅我之前的评论。好奇的是,您为什么要处理宽数据?在这里,日期应该是它自己的列,旁边有值。对于广泛的数据集,计算和争论非常困难。重塑为长格式,无循环运行所需的聚合,生活会更轻松。@Parfait在中阅读excel工作表后,我在前面应用了.sum()
和.groupby()
。我最初的Excel工作表每月每个字符有多个条目,所以是的,日期以前有自己的列,我想把行数降到唯一字符数。这样我就可以逐月看到趋势,只是为了我自己的利益。我只复制了前两个月和前两个字符,以保持我的帖子简短。希望这能澄清这一点。宽幅格式通常用于最终用途的报告需求,应该是最后一步。再次从Excel导入,使用melt
将其重塑为长格式,然后运行聚合/计算。无需循环或维护许多列。