Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.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 熊猫:使用“应用”创建2个新列_Python_Pandas_Dataframe_Numpy - Fatal编程技术网

Python 熊猫:使用“应用”创建2个新列

Python 熊猫:使用“应用”创建2个新列,python,pandas,dataframe,numpy,Python,Pandas,Dataframe,Numpy,我有一个数据集,其中col a表示值e、I、d、t中的总值的数量,这些值采用字符串格式,以“-”分隔 我想创建8个新列,4个表示(e-I-d-t)的和,4个表示乘积 例如: def funct_两个输出(E、I、d、t、d_校准=50): 返回E+i+d+t,E*i*d*t 输出前2个值: 和0,行0=40+0.5+30+1和1=80+0.3+32+1 和和和与积都是示例函数,它们取代了稍微复杂一点的my函数。 我编写了一个函数**expand\u on\u col**,该函数创建了一个新的列

我有一个数据集,其中col a表示值e、I、d、t中的总值的数量,这些值采用字符串格式,以“-”分隔

我想创建8个新列,4个表示(e-I-d-t)的和,4个表示乘积

例如:

def funct_两个输出(E、I、d、t、d_校准=50):
返回E+i+d+t,E*i*d*t
输出前2个值: 和0,行0=40+0.5+30+1和1=80+0.3+32+1

和和和与积都是示例函数,它们取代了稍微复杂一点的my函数。

我编写了一个函数**expand\u on\u col**,该函数创建了一个新的列,将所有e、I、d、t值分隔成新的列:

def expand_on_col(df_,col_to_split=“namecol”,sep='-',prefix=“this”):
'''
传递一个df,指示要拆分的列,
返回带有带前缀的列拆分的df。
'''
df1=df_u[col_to_split].str.split(sep,expand=True)。添加_前缀(prefix)
df1=pd.concat([df_,df1],轴=1)。替换(np.nan,“-”)
返回df1
现在我需要创建4个新列,它们是eidt的和,4个是proct

SUM的输出示例:

   index  a              e                i            d        t  a-0  e-0  e-1  e-2  e-3  i-0  i-1  i-2  i-3  d-0  d-1  d-2  d-3  t-0  t-1  t-2  t-3  sum-0  sum-1  sum-2  sum-3
0      0  4  40-80-120-150  0.5-0.3-0.2-0.2  30-32-30-32  1-1-1-1    4   40   80  120  150  0.5  0.3  0.2  0.2   30   32   30   32    1    1    1    1     71    114    153    186
1      1  4    40-40-40-40  0.1-0.1-0.1-0.1  18-18-18-18  1-2-3-4    4   40   40   40   40  0.1  0.1  0.1  0.1   18   18   18   18    1    2    3    4     59     61     63     65
2      3  4  40-80-120-150  0.5-0.3-0.2-0.2  30-32-30-32  1-1-1-1    4   40   80  120  150  0.5  0.3  0.2  0.2   30   32   30   32    1    1    1    1     71    114    153    186
3      5  4    40-40-40-40  0.1-0.1-0.1-0.1  18-18-18-18  1-2-3-4    4   40   40   40   40  0.1  0.1  0.1  0.1   18   18   18   18    1    2    3    4     59     61     63     65

如果我用funct_one_输出(只返回sum)运行代码,它会工作,但用funct_two_输出(suma和product)我会得到一个错误

代码如下:

将熊猫作为pd导入
def expand_on_col(df_,col_to_split=“namecol”,sep='-',prefix=“this”):
'''
传递一个df,指示要拆分的列,
返回带有带前缀的列拆分的df。
'''
df1=df_u[col_to_split].str.split(sep,expand=True)。添加_前缀(prefix)
df1=pd.concat([df_,df1],轴=1)。替换(np.nan,“-”)
返回df1
def funct_两个_输出(E,I,d,t,d_calib=50):#我要传递的函数
返回E+i+d+t,E*i*d*t
def funct_one_输出(E,I,d,t,d_calib=50):#现在我只能使用这个,不能使用2个返回值。
返回E+i+d+t
对于列中的列:
df=expand_on_col(df_=df,col_to_split=col,sep='-',前缀=f“{col}-”)
cols_uz=df.columns.drop(列)
df[cols\uu]=df[cols\uu]。应用(pd.to\u numeric,errors=“强制”)
df[“a”]=df[“a”]。应用(pd.to_numeric,errors=“胁迫”)
df.reset_索引(原地=真)
对于范围内的i(最大值(df[“a”]):
name_1,name_2=f“sum-{i}”,f“mult-{i}”
df[name_1]=df.apply(lambda行:funct_one_输出(E=row[f'E-{i}],i=row[f'i-{i}],d=row[f'd-{i}],t=row[f“t-{i}],轴=1)
#如果我尝试填充2个输出,它将不起作用
df[[name_1,name_2]]=df.apply(lambda行:函数两个输出(E=row[f'E-{i}],i=row[f'i-{i}],d=row[f'd-{i}],t=row[f't-{i}],轴=1)
输出:

ValueError回溯(最近一次调用)
在()
68 df[name_1]=df.apply(lambda行:funct_one_输出(E=row[f'E-{i}],i=row[f'i-{i}],d=row[f'd-{i}],t=row[f't-{i}],轴=1)
69#如果我尝试填充两个输出,它将不起作用
--->70 df[[name_1,name_2]]=df.apply(lambda行:函数两个输出(E=row[f'E-{i}],i=row[f'i-{i}],d=row[f'd-{i}],t=row[f't-{i}],轴=1)
71
72
2帧
/usr/local/lib/python3.7/dist-packages/pandas/core/frame.py in____设置项__(self、key、value)
3039自置项框(键、值)
3040 elif isinstance(键,(系列,np.ndarray,列表,索引)):
->3041 self.\u setitem\u数组(键、值)
3042其他:
3043#设置列
/数组中的usr/local/lib/python3.7/dist-packages/pandas/core/frame.py(self、key、value)
3074                 )[1]
3075自我检查设置项目拷贝()
->3076 self.iloc.\u setitem\u和索引器((片(无),索引器),值)
3077
3078定义设置项帧(自身、键、值):
/usr/local/lib/python3.7/dist-packages/pandas/core/index.py在带有索引器(self、indexer、value)的setitem中
1751如果len(ilocs)!=len(值):
1752升值错误(
->1753“必须具有相等的len键和值”
1754“使用iterable设置时”
1755                         )
ValueError:使用iterable设置时,必须具有相等的len键和值
不要使用
apply
如果你能帮忙的话

s = pd.to_numeric(
    df[['e', 'i', 'd', 't']]
      .stack()
      .str.split('-', expand=True)
      .stack()
)

sums = s.sum(level=[0, 2]).rename('Sum')
prods = s.prod(level=[0, 2]).rename('Prod')

sums_prods = pd.concat([sums, prods], axis=1).unstack()

sums_prods.columns = [f'{o}-{i}' for o, i in sums_prods.columns]

df.join(sums_prods)

   a              e                i            d        t  Sum-0  Sum-1  Sum-2  Sum-3  Prod-0  Prod-1  Prod-2  Prod-3
0  4  40-80-120-150  0.5-0.3-0.2-0.2  30-32-30-32  1-1-1-1   71.5  113.3  151.2  183.2   600.0   768.0   720.0   960.0
1  4    40-40-40-40  0.1-0.1-0.1-0.1  18-18-18-18  1-2-3-4   59.1   60.1   61.1   62.1    72.0   144.0   216.0   288.0
3  4  40-80-120-150  0.5-0.3-0.2-0.2  30-32-30-32  1-1-1-1   71.5  113.3  151.2  183.2   600.0   768.0   720.0   960.0
5  4    40-40-40-40  0.1-0.1-0.1-0.1  18-18-18-18  1-2-3-4   59.1   60.1   61.1   62.1    72.0   144.0   216.0   288.0

布里里安,谢谢!非常清楚而且有用。我接受得有点太早了,在我的现实世界示例中,我不仅仅做求和或乘积,而是有一个函数,它将(E,I,d,t)作为输入并返回一个值,我使用了produc,sum,就像exmaple一样。如何修改您的代码,以便将函数传递给它,而不是调用“sum”或“prod”?
s = pd.to_numeric(
    df[['e', 'i', 'd', 't']]
      .stack()
      .str.split('-', expand=True)
      .stack()
)

sums = s.sum(level=[0, 2]).rename('Sum')
prods = s.prod(level=[0, 2]).rename('Prod')

sums_prods = pd.concat([sums, prods], axis=1).unstack()

sums_prods.columns = [f'{o}-{i}' for o, i in sums_prods.columns]

df.join(sums_prods)

   a              e                i            d        t  Sum-0  Sum-1  Sum-2  Sum-3  Prod-0  Prod-1  Prod-2  Prod-3
0  4  40-80-120-150  0.5-0.3-0.2-0.2  30-32-30-32  1-1-1-1   71.5  113.3  151.2  183.2   600.0   768.0   720.0   960.0
1  4    40-40-40-40  0.1-0.1-0.1-0.1  18-18-18-18  1-2-3-4   59.1   60.1   61.1   62.1    72.0   144.0   216.0   288.0
3  4  40-80-120-150  0.5-0.3-0.2-0.2  30-32-30-32  1-1-1-1   71.5  113.3  151.2  183.2   600.0   768.0   720.0   960.0
5  4    40-40-40-40  0.1-0.1-0.1-0.1  18-18-18-18  1-2-3-4   59.1   60.1   61.1   62.1    72.0   144.0   216.0   288.0