Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 创建多个dataframe列,其中包含来自现有列的计算值_Python_Pandas_For Loop_Dataframe - Fatal编程技术网

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
将其重塑为长格式,然后运行聚合/计算。无需循环或维护许多列。