熊猫:通过填充特定值组合数据框中的两个字符串列

时间:2018-07-31 13:19:51

标签: python string pandas function dataframe

我有这个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中的所有“ Yes”值都将结转到新列V3_4中,而V4中的“ Yes”值也将结转到V3_4列中。 / p>

看起来我可以通过填充或使用某些逻辑构建python函数来完成此操作。无论哪种方法都可以,我想知道最优雅的是什么。

4 个答案:

答案 0 :(得分:6)

使用documentation

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')

答案 1 :(得分:2)

使用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

答案 2 :(得分:1)

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)

答案 3 :(得分:0)

看似微不足道,但我们可以将“是”替换为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