【问题标题】:Pandas: Combine two string columns in dataframe by filling forward certain value熊猫:通过向前填充某个值来组合数据框中的两个字符串列
【发布时间】:2019-01-07 21:48:40
【问题描述】:

我有这个df

import pandas as pd

df1 = pd.DataFrame({
  'Type': ['red', 'blue', 'red', 'red', 'blue'],
  'V1': ['No', 'No', 'No', 'Yes', 'No'],
  'V2': ['Yes', 'Yes', 'No', 'Yes', 'No'],
  'V3': ['Yes', 'No', 'No', 'Yes', 'No'],
  'V4': ['No', 'No', 'No', 'Yes', 'Yes']
})

我想要一个如下所示的数据框:

    Type    V1    V2    V3    V4   V3_4 
0   red     No    Yes   Yes   No   Yes
1   blue    No    Yes   No    No   No
2   red     No    No    No    No   No
3   red     Yes   Yes   Yes   Yes  Yes
4   blue    No    No    No    Yes  Yes

因此,基本上来自V3 的任何“是”值都将转入一个新列V3_4,并将来自V4 的“是”值转入V3_4 列。

看起来我可以使用 ffill 或使用某些逻辑构建 python 函数来做到这一点。两种方法我都可以,我想知道最优雅的是什么。

【问题讨论】:

    标签: python string pandas function dataframe


    【解决方案1】:

    这可能看起来微不足道,但我们可以将“是”替换为 True 并执行或操作

    df1 = pd.DataFrame({'Type':['red','blue','red','red','blue'], 'V1':['No','No','No','Yes','No'], 'V2':['Yes','Yes','No','Yes','No'], 'V3':['Yes','No','No','Yes','No'], 'V4':['No','No','No','Yes','Yes']})
    
    df1[['V3','V4']]=df1[['V3','V4']].replace({'Yes':True,'No':False})
    x=df1.V4.astype('bool')|df1.V3.astype('bool')
    
    df1[['V3','V4']]=df1[['V3','V4']].replace({True:'Yes',False:'No'})
    df1['V3_4']=x.replace({True:'Yes',False:'No'})
    df1
    

    【讨论】:

      【解决方案2】:

      使用np.where

      df['V3_4'] = np.where(df.V3.eq('Yes') | df.V4.eq('Yes'), 'Yes', 'No')
      
         Type   V1   V2   V3   V4 V3_4
      0   red   No  Yes  Yes   No  Yes
      1  blue   No  Yes   No   No   No
      2   red   No   No   No   No   No
      3   red  Yes  Yes  Yes  Yes  Yes
      4  blue   No   No   No  Yes  Yes
      

      感谢@Anton vBR,这也可以写得更简洁一点:

      np.where((df1[['V3','V4']].eq('Yes')).any(1), 'Yes', 'No')
      

      【讨论】:

      • 太棒了!这运作良好。我可以在 8 分钟内接受 :)
      • 我认为这很优雅,可能会写成np.where((df1[['V3','V4']] == 'Yes').any(1), 'Yes', 'No')
      • 我会把它添加到答案中,我也喜欢这个
      【解决方案3】:
      def build(a,b):
          if a =='Yes':
              return "Yes"
          elif b =='Yes':
              return "Yes"
          else:
              return "No"
      
      df1['V3_4'] = df1[['V3','V4']].apply(lambda x : build(x),axis =1)
      

      【讨论】:

      • 去掉第二个和第三个检查,让你的else条件返回b
      • 可以,但尽量避免申请!
      【解决方案4】:

      使用np.where

      例如:

      import pandas as pd
      import numpy as np
      df1 = pd.DataFrame({'Type':['red','blue','red','red','blue'], 'V1':['No','No','No','Yes','No'], 'V2':['Yes','Yes','No','Yes','No'], 'V3':['Yes','No','No','Yes','No'], 'V4':['No','No','No','Yes','Yes']})
      df1["V3_4"] = np.where(df1["V3"] == "No", df1["V4"], df1["V3"])
      print(df1)
      

      输出:

         Type   V1   V2   V3   V4 V3_4
      0   red   No  Yes  Yes   No  Yes
      1  blue   No  Yes   No   No   No
      2   red   No   No   No   No   No
      3   red  Yes  Yes  Yes  Yes  Yes
      4  blue   No   No   No  Yes  Yes
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-24
        • 1970-01-01
        相关资源
        最近更新 更多