我有这个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函数来完成此操作。无论哪种方法都可以,我想知道最优雅的是什么。
答案 0 :(得分:6)
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