Как заполнить значения в новом столбце в кадре данных при нескольких условиях - PullRequest
1 голос
/ 07 октября 2019

Я пытаюсь заполнить столбец Окончательный значениями, если Число содержит некоторые значения и Код содержит 0, тогда значение присутствует в Код т.е. 0 следует заменить значением столбца Number , с которым я могу работать:

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

, но для строк нет. 5, 6 и 7 Я столкнулся с проблемой, значение должно быть в столбце Окончательный с наименьшим заполненным значением 00. Как этого можно достичь с помощью панд? Двойной ноль (00) может поступать только последовательно.

Ответы [ 2 ]

2 голосов
/ 07 октября 2019

Вы можете сравнить значения с Series.str.count и условиями цепи 3 с | для bitwise OR и & для bitwise AND с numpy.where:

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
1 голос
/ 07 октября 2019

Мы можем count количество нулей в обоих столбцах и взять его с собой в np.where:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...