根据熊猫的if条件选择列值

问题描述:

我有一个像这样的空df。根据熊猫的if条件选择列值

dfSummary=pd.DataFrame(columns=['Company Type' , 'Max_Val', 'Min_Val'] , dtype=str) 

我有一个变量CompanyType,它可以有两个值让我们说'公共'或'私人'。我正在分析两种公司类型的数据,并且想要用另一个变量值maxValue(如果companyType ='private')和minVal(如果companyType ='public')填充df。 我使用dfSummary创建了一个带有值和concat的tempdf。

tempdf=pd.DataFrame({'CompanyType':companyType, 'max Val': maxVal,'min Val': minVal }, index=[0]) 
dfSummary=pd.concat([dfSummary,tempdf]) 

我想用pythonic方式初始化temdf,其中'max Val'或'min Val'基于公司类型。换句话说,我想要如果条件,当我创建tempdf。请帮忙。

+0

你应该明白,'dfSummary'有3列,所以无论你是用串联也必须有3列。如果要输入minVal,那么Max_Val列的值是多少? –

+0

minVal或maxVal之一将基于companyType值为空。如果条件是我创建dfTemp时,我想要处理相同的行。 –

+0

你使用的是什么版本的Python? –

col = [companyType] + ([maxValue, np.nan] 
      if companyType == 'public' else [np.nan, minValue])  
df = pd.DataFrame([col], columns=['Company Type' , 'Max_Val', 'Min_Val']) 

IIUC

设置

dfSummary = pd.DataFrame(
    [['public', 'a', 'b'], 
    ['private', 'c', 'd'], 
    ['public', 'e', 'f'], 
    ['private', 'g', 'h'], 
    ['privage', 'i', 'j']], 
    columns=['Company Type' , 'Max_Val', 'Min_Val'], 
    dtype=str 
) 

dfSummary 

    Company Type Max_Val Min_Val 
0  public  a  b 
1  private  c  d 
2  public  e  f 
3  private  g  h 
4  privage  i  j 

溶液1
np.where

dfSummary.assign(
    New=np.where(
     dfSummary['Company Type'] == 'public', 
     dfSummary.Max_Val, dfSummary.Min_Val) 
) 

    Company Type Max_Val Min_Val New 
0  public  a  b a 
1  private  c  d d 
2  public  e  f e 
3  private  g  h h 
4  privage  i  j j 

解决方案2
随着pd.Series.where

dfSummary.assign(
    New=dfSummary.Max_Val.where(
     dfSummary['Company Type'] == 'public', 
     dfSummary.Min_Val) 
) 

    Company Type Max_Val Min_Val New 
0  public  a  b a 
1  private  c  d d 
2  public  e  f e 
3  private  g  h h 
4  privage  i  j j 
+0

这是一个很好的解决方案。我不确定这是OP想要的,但它仍然值得一些+1。 –