【问题标题】:Pandas python updating values in a table based on preexisting values and conditionsPandas python根据预先存在的值和条件更新表中的值
【发布时间】:2016-10-16 04:59:51
【问题描述】:

我有一个数据框:

import pandas as pd

df=pd.DataFrame({
'Player': ['John','John','John','Steve','Steve','Ted', 'James','Smitty','SmittyJr','DJ'],
'Name': ['A','B', 'A','B','B','C', 'A','D','D','D'],
'Group':['2A','1B','2A','2A','1B','1C','2A','1C','1C','2A'],
'Medal':['G', '?', '?', 'S', 'B','?','?','?','G','?']
})

df =  df[['Player','Group', 'Name', 'Medal']]
print(df)

我想更新所有的 '?'在 Medal 列中,其中任何行的值与已填充的 NameGroup 列匹配。

例如,因为第一个 row 0Name:A, Group:2A, Medal:G,那么 '?'在row 62 上将是“G”

结果应如下所示:

res=pd.DataFrame({
'Player': ['John','John','John','Steve','Steve','Ted', 'James','Smitty','SmittyJr','DJ'],
'Name': ['A','B', 'A','B','B','C', 'A','D','D','D'],
'Group':['2A','1B','2A','2A','1B','1C','2A','1C','1C','2A'],
'Medal':['G', 'B', 'G', 'S', 'B','?','G','G','G','?']
})

res =  res[['Player','Group', 'Name', 'Medal']]
print(res)

最有效的方法是什么?

【问题讨论】:

    标签: python pandas dataframe iteration conditional-statements


    【解决方案1】:

    试试:

    import pandas as pd
    import numpy as np
    
    myfill = lambda df: df.ffill().bfill()
    df.replace('?', np.nan).groupby(['Name', 'Group']).apply(myfill).fillna('?')
    
         Player Group Name Medal
    0      John    2A    A     G
    1      John    1B    B     B
    2      John    2A    A     G
    3     Steve    2A    B     S
    4     Steve    1B    B     B
    5       Ted    1C    C     ?
    6     James    2A    A     G
    7    Smitty    1C    D     G
    8  SmittyJr    1C    D     G
    9        DJ    2A    D     ?
    

    【讨论】:

      【解决方案2】:

      另一种解决方案,每个组中的 replace ? 按最后一个值(iloc)排序 Medalsort_values):

      df['Medal'] = df.groupby(['Group','Name'])['Medal']
                      .apply(lambda x: x.replace('?', x.sort_values().iloc[-1]))
      
      print(df)
           Player Group Name Medal
      0      John    2A    A     G
      1      John    1B    B     B
      2      John    2A    A     G
      3     Steve    2A    B     S
      4     Steve    1B    B     B
      5       Ted    1C    C     ?
      6     James    2A    A     G
      7    Smitty    1C    D     G
      8  SmittyJr    1C    D     G
      9        DJ    2A    D     ?
      

      时间安排

      In [81]: %timeit (df.groupby(['Group','Name'])['Medal'].apply(lambda x: x.replace('?', x.sort_values().iloc[-1])))
      100 loops, best of 3: 4.13 ms per loop
      
      In [82]: %timeit (df.replace('?', np.nan).groupby(['Name', 'Group']).apply(lambda df: df.ffill().bfill()).fillna('?'))
      100 loops, best of 3: 11.3 ms per loop
      

      【讨论】:

        猜你喜欢
        • 2021-12-10
        • 2021-07-08
        • 1970-01-01
        • 2020-02-20
        • 2021-11-18
        • 1970-01-01
        • 2022-01-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多