繁体   English   中英

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

[英]Pandas: Combine two string columns in dataframe by filling forward certain value

我有这个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至列V3_4

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM