首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >熊猫:使用申请创建2个新列

熊猫:使用申请创建2个新列
EN

Stack Overflow用户
提问于 2021-03-15 18:13:42
回答 1查看 58关注 0票数 2

我有一个数据集,其中col表示e、i、d、t值中以字符串格式以"-“分隔的值的总数。

代码语言:javascript
复制
   a              e                i            d        t
0  4  40-80-120-150  0.5-0.3-0.2-0.2  30-32-30-32  1-1-1-1
1  4    40-40-40-40  0.1-0.1-0.1-0.1  18-18-18-18  1-2-3-4
3  4  40-80-120-150  0.5-0.3-0.2-0.2  30-32-30-32  1-1-1-1
5  4    40-40-40-40  0.1-0.1-0.1-0.1  18-18-18-18  1-2-3-4

我想要创建8个新列,4个代表( product )的和,4个产品.

例如:

代码语言:javascript
复制
def funct_two_outputs(E, I, d, t, d_calib = 50):
  return E+i+d+t, E*i*d*t

OUT前2个值: SUM_0,row0 = 40+0.5+30+1 SUM_1 = 80+0.3+32+1

求和和积是示例函数,它替代了我的函数,这有点复杂.

我编写了一个函数**expand_on_col **,该函数创建了将所有e,i,d,t值分隔为新列的函数:

代码语言:javascript
复制
def expand_on_col (df_, col_to_split = "namecol", sep='-', prefix="this"): 
  '''
  Pass a df indicating on which col you want to split, 
  return a df with the col split with a prefix.  
  
  '''
  df1 = df_[col_to_split].str.split(sep,expand=True).add_prefix(prefix)
  df1 = pd.concat([df_,df1], axis=1).replace(np.nan, '-')
  return df1 

现在我需要创建4个新列,它们是eidt的和,以及4个是prodct。

SUM的输出示例:

代码语言:javascript
复制
   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_output运行代码(只返回sum),它就能工作,但是通过funct_two_outputs(suma和product),我会得到一个错误。

以下是代码:

代码语言:javascript
复制
import pandas as pd 
def expand_on_col (df_, col_to_split = "namecol", sep='-', prefix="this"): 
  '''
  Pass a df indicating on which col you want to split, 
  return a df with the col split with a prefix.  
  
  '''
  df1 = df_[col_to_split].str.split(sep,expand=True).add_prefix(prefix)
  df1 = pd.concat([df_,df1], axis=1).replace(np.nan, '-')
  return df1 


def funct_two_outputs(E, I, d, t, d_calib = 50): #the function i want to pass
  return E+i+d+t,  E*i*d*t

def funct_one_outputs(E, I, d, t, d_calib = 50): #for now i can olny use this one, cant use 2 return values.
  return E+i+d+t

for col in columns: 
  df = expand_on_col (df_=df, col_to_split = col,  sep='-', prefix=f"{col}-")
  cols_ = df.columns.drop(columns)

  df[cols_]= df[cols_].apply(pd.to_numeric, errors="coerce")
df["a"] = df["a"].apply(pd.to_numeric, errors="coerce")
df.reset_index(inplace=True)
for i in range (max(df["a"])):  
  name_1, name_2 = f"sum-{i}", f"mult-{i}" 
  df[name_1] = df.apply(lambda row: funct_one_outputs(E= row[f'e-{i}'], I=row[f'i-{i}'], d=row[f'd-{i}'], t=row[f"t-{i}"]), axis=1)
   #if i try and fill 2 outputs it wont work 
  df[[name_1, name_2]] = df.apply(lambda row: funct_two_outputs(E= row[f'e-{i}'], I=row[f'i-{i}'], d=row[f'd-{i}'], t=row[f"t-{i}"]), axis=1)

退出:

代码语言:javascript
复制
ValueError                                Traceback (most recent call last)
<ipython-input-306-85157b89d696> in <module>()
     68   df[name_1] = df.apply(lambda row: funct_one_outputs(E= row[f'e-{i}'], I=row[f'i-{i}'], d=row[f'd-{i}'], t=row[f"t-{i}"]), axis=1)
     69    #if i try and fill 2 outputs it wont work
---> 70   df[[name_1, name_2]] = df.apply(lambda row: funct_two_outputs(E= row[f'e-{i}'], I=row[f'i-{i}'], d=row[f'd-{i}'], t=row[f"t-{i}"]), axis=1)
     71 
     72 

2 frames
/usr/local/lib/python3.7/dist-packages/pandas/core/frame.py in __setitem__(self, key, value)
   3039             self._setitem_frame(key, value)
   3040         elif isinstance(key, (Series, np.ndarray, list, Index)):
-> 3041             self._setitem_array(key, value)
   3042         else:
   3043             # set column

/usr/local/lib/python3.7/dist-packages/pandas/core/frame.py in _setitem_array(self, key, value)
   3074                 )[1]
   3075                 self._check_setitem_copy()
-> 3076                 self.iloc._setitem_with_indexer((slice(None), indexer), value)
   3077 
   3078     def _setitem_frame(self, key, value):

/usr/local/lib/python3.7/dist-packages/pandas/core/indexing.py in _setitem_with_indexer(self, indexer, value)
   1751                     if len(ilocs) != len(value):
   1752                         raise ValueError(
-> 1753                             "Must have equal len keys and value "
   1754                             "when setting with an iterable"
   1755                         )

ValueError: Must have equal len keys and value when setting with an iterable
EN

回答 1

Stack Overflow用户

发布于 2021-03-15 18:34:28

不要使用apply

如果你能帮忙的话

代码语言:javascript
复制
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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66643388

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档