Кадр данных Pandas заменяет максимальное значение столбца другим значением столбца в зависимости от условия - PullRequest
0 голосов
/ 08 мая 2018

У меня есть фрейм данных с несколькими столбцами, и я хотел заменить только максимальное значение столбец «Представления» тремя различными столбцами, основанными на определенных условиях.

 import pandas as PD
    data = [["1.Blend Of Vdx Display","DISPLAY","Features","CPE",1255,778732,13373,7142],["1.Blend Of Vdx Display","DISPLAY","TVC","CPE",10479,778732,13373,7142],
    ["2.Mobile VDX","Display","Features","CPE",168,1000,150,160],["2.Mobile VDX","Display","Features","CPE",2309,1000,150,160]]
df = pd.DataFrame(data,columns=['Placement#Name','PRODUCT','VIDEONAME','COST_TYPE',views','IMPRESSIONS','ENGAGEMENTS','DPEENGAMENTS'])



 print(df)
  Placement#Name  PRODUCT VIDEONAME COST_TYPE  views  IMPRESSIONS  \
0  1.Blend Of Vdx Display  DISPLAY  Features       CPE   1255       778732   
1  1.Blend Of Vdx Display  DISPLAY       TVC       CPE  10479       778732   
2            2.Mobile VDX  DISPLAY  Features       CPE    168         1000   
3            2.Mobile VDX  DISPLAY  Features       CPE   2309         1000   

   ENGAGEMENTS  DPEENGAMENTS  
0        13373          7142  
1        13373          7142  
2          150           160  
3          150           160

Я могу отфильтровать максимальное значение, выполнив это

 newdf = df.loc[df.reset_index().groupby(['Placement#Name'])['Views'].idxmax()]

print (newdf)
         Placement#Name  PRODUCT VIDEONAME COST_TYPE  Views  IMPRESSIONS  \
1  1.Blend Of Vdx Display  DISPLAY       TVC       CPE  10479       778732   
3            2.Mobile VDX  DISPLAY  Features       CPE   2309         1000   

   ENGAGEMENTS  DPEENGAMENTS  
1        13373          7142  
3          150           160 

теперь я хотел заменить новые представления PDF условиями, такими как 10479 и 2309, можно заменить на столбцы Engagements, как при условии, что отображается Product, а Cost_Type - CPE.

новый вывод df

print (newdf)
             Placement#Name  PRODUCT VIDEONAME COST_TYPE  Views  IMPRESSIONS  \
    1  1.Blend Of Vdx Display  DISPLAY       TVC       CPE  13373       778732   
    3            2.Mobile VDX  DISPLAY  Features       CPE   150        1000   

       ENGAGEMENTS  DPEENGAMENTS  
    1        13373          7142  
    3          150           160 

и затем я хотел преобразовать это в оригинальную df. поэтому оригинальный вывод:

print (df)
     Placement#Name  PRODUCT VIDEONAME COST_TYPE  views  IMPRESSIONS  \
    0  1.Blend Of Vdx Display  DISPLAY  Features       CPE   1255       778732   
    1  1.Blend Of Vdx Display  DISPLAY       TVC       CPE  13373       778732   
    2            2.Mobile VDX  DISPLAY  Features       CPE    168         1000   
    3            2.Mobile VDX  DISPLAY  Features       CPE   150         1000   

       ENGAGEMENTS  DPEENGAMENTS  
    0        13373          7142  
    1        13373          7142  
    2          150           160  
    3          150           160

Ответы [ 2 ]

0 голосов
/ 08 мая 2018

Еще один способ сделать -

Отфильтровывает и заменяет конкретные случаи от views до ENGAGEMENTS

newdf['views'] = newdf.apply(lambda x: x['ENGAGEMENTS'] if ((x['PRODUCT'].upper()=='DISPLAY') & (x['COST_TYPE']=='CPE')) else x['views'], axis=1)

Добавить 2 кадра данных

df['views'].update(newdf['views'])

Выход

           Placement#Name  PRODUCT VIDEONAME COST_TYPE  views  IMPRESSIONS  \
0  1.Blend Of Vdx Display  DISPLAY  Features       CPE   1255       778732   
1  1.Blend Of Vdx Display  DISPLAY       TVC       CPE  13373       778732   
2            2.Mobile VDX  Display  Features       CPE    168         1000   
3            2.Mobile VDX  Display  Features       CPE    150         1000   

   ENGAGEMENTS  DPEENGAMENTS  
0        13373          7142  
1        13373          7142  
2          150           160  
3          150           160 
0 голосов
/ 08 мая 2018

Я считаю нужным:

newdf = df.loc[df.reset_index().groupby(['Placement#Name'])['Views'].idxmax()]

#filter by conditions
mask = (newdf.PRODUCT.str.upper() == 'DISPLAY') & (newdf.COST_TYPE == 'CPE')

newdf.loc[mask, 'Views'] = newdf['ENGAGEMENTS']
print (newdf)
           Placement#Name  PRODUCT VIDEONAME COST_TYPE  Views  IMPRESSIONS  \
1  1.Blend Of Vdx Display  DISPLAY       TVC       CPE  13373       778732   
3            2.Mobile VDX  Display  Features       CPE    150         1000   

   ENGAGEMENTS  DPEENGAMENTS  
1        13373          7142  
3          150           160  

#remove old index rows and append new from newdf
df = df.drop(newdf.index).append(newdf).sort_index()
print(df)
           Placement#Name  PRODUCT VIDEONAME COST_TYPE  Views  IMPRESSIONS  \
0  1.Blend Of Vdx Display  DISPLAY  Features       CPE   1255       778732   
1  1.Blend Of Vdx Display  DISPLAY       TVC       CPE  13373       778732   
2            2.Mobile VDX  Display  Features       CPE    168         1000   
3            2.Mobile VDX  Display  Features       CPE    150         1000   

   ENGAGEMENTS  DPEENGAMENTS  
0        13373          7142  
1        13373          7142  
2          150           160  
3          150           160  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...