Python 熊猫:使用“应用”创建2个新列
我有一个数据集,其中col a表示值e、I、d、t中的总值的数量,这些值采用字符串格式,以“-”分隔 我想创建8个新列,4个表示(e-I-d-t)的和,4个表示乘积 例如: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**,该函数创建了一个新的列
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