Python 如何在多个条件下在dataframe的新列中填充值
我正在尝试用值填充Final列如果Number包含一些值,而Code包含0,则Code中的值即0应替换为Number列的值,我可以使用: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条件与|进行比较,对于按位或和,对于按位和: 详情: 您可以将值与
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