Python 如何在多个条件下在dataframe的新列中填充值

Python 如何在多个条件下在dataframe的新列中填充值,python,pandas,dataframe,Python,Pandas,Dataframe,我正在尝试用值填充Final列如果Number包含一些值,而Code包含0,则Code中的值即0应替换为Number列的值,我可以使用: df['Final'] = np.where(df['Code'] == 0, df['Number'], df['Code']) 但是对于第5行、第6行和第7行,我面临一个问题,该值应该位于最后一列中,并且填充的00个值最少。熊猫如何做到这一点?双零00只能以连续方式出现。您可以将值与和链3条件与|进行比较,对于按位或和,对于按位和: 详情: 您可以将值与

我正在尝试用值填充Final列如果Number包含一些值,而Code包含0,则Code中的值即0应替换为Number列的值,我可以使用:

df['Final'] = np.where(df['Code'] == 0, df['Number'], df['Code'])

但是对于第5行、第6行和第7行,我面临一个问题,该值应该位于最后一列中,并且填充的00个值最少。熊猫如何做到这一点?双零00只能以连续方式出现。

您可以将值与和链3条件与|进行比较,对于按位或和,对于按位和:

详情:


您可以将值与和链3条件与|用于按位或与&用于按位和:

详情:

我们可以计算两列中零的数量,并将其带到np中。其中:

我们可以计算两列中零的数量,并将其带到np中。其中:


你还没有注意到我面临的案例5、6和7的问题that@ParthTiwari-您现在可以检查吗?当我写入前两行时,即a和b,以10为基数的int的无效文本时,会引发错误:@ParthTiwari-数字中是否缺少值?还是只包含缺少值的字符串?它的工作非常感谢它的工作可以解释df['Final']=np.wherem2 | m3&m1,df['Code'],df['Number']你还没有注意到我面临的案例5、6和7的问题that@ParthTiwari-您现在可以检查吗?当我写入前两行时,即a和b,以10为基数的int的无效文本时,会引发错误:@ParthTiwari-数字中是否缺少值?还是只包含缺少值的字符串?它的工作非常感谢它的工作可以解释df['Final']=np.wherem2 | m3&m1,df['Code'],df['Number']您的预期输出是什么?您的代码非常适合MEF。最后一列应该包含数字中的列值和填充00个值最少的代码。您的代码和数字列的类型是什么?你能检查一下df.dtypes你期望的输出是什么吗?你的代码对我来说非常有效。最后一列应该包含数字中的列值和填充了最少00个值的代码。你的代码和数字列的类型是什么?你能查一下df.dtypes吗
print (df)
   No    Number      Code     Final
0   1  78797071         0  78797071
1   2         0  89797071  89797071
2   3         0  57797074  57797074
3   4  39797571         0  39797571
4   5  62170000  62175268  62175268
5   6  52130000  52000000  52130000
6   7  52146700  52140000  52146700

a = df['Number'].astype(str).str.count('0')
b = df['Code'].astype(str).str.count('0')

#test if value is not 0
m1 = df['Code'] != 0
#test if value is 0
m2 = df['Number'] == 0
#test if number of 0 is higher
m3 = a > b

df['Final'] = np.where((m1 & m2) | m3, df['Code'], df['Number'])
print (df)

   No    Number      Code     Final
0   1  78797071         0  78797071
1   2         0  89797071  89797071
2   3         0  57797074  57797074
3   4  39797571         0  39797571
4   5  62170000  62175268  62175268
5   6  52130000  52000000  52130000
6   7  52146700  52140000  52146700
print (df.assign(m1 = m1,
                 m2 = m2,
                 m3 = m3,
                 m1ANDm2 = m1 & m2,
                 mask= (m1 & m2) | m3))

   No    Number      Code     Final     m1     m2     m3  m1ANDm2   mask
0   1  78797071         0  78797071  False  False  False    False  False
1   2         0  89797071  89797071   True   True  False     True   True
2   3         0  57797074  57797074   True   True  False     True   True
3   4  39797571         0  39797571  False  False  False    False  False
4   5  62170000  62175268  62175268   True  False   True    False   True
5   6  52130000  52000000  52130000   True  False  False    False  False
6   7  52146700  52140000  52146700   True  False  False    False  False
count1 = df['Number'].astype(str).str.count('0') 
count2 = df['Code'].replace(0, np.NaN).astype(str).str.count('0')

df['Final'] = np.where(df['Code']==0 | (count1<count2), df['Number'], df['Code'])
   No    Number      Code     Final
0   1  78797071         0  78797071
1   2         0  89797071  89797071
2   3         0  57797074  57797074
3   4  39797571         0  39797571
4   5  62170000  62175268  62175268
5   6  52130000  52000000  52000000
6   7  52146700  52140000  52140000