代码之家  ›  专栏  ›  技术社区  ›  JAG2024

PADAS数据帧:基于另一列中的值替换多行

  •  2
  • JAG2024  · 技术社区  · 7 年前

    我试图用另一个数据帧列中的值替换一个数据帧列中的一些值。下面是数据帧的外观。 df2 有很多行和列。

    df1
    
        0                   1029
    0   aaaaa               Green
    1   bbbbb               Green
    2   fffff               Blue
    3   xxxxx               Blue
    4   zzzzz               Green
    
    df2
        0       1   2     3  ....    1029
    0   aaaaa   1   NaN   14         NaN
    1   bbbbb   1   NaN   14         NaN
    2   ccccc   1   NaN   14         Blue
    3   ddddd   1   NaN   14         Blue
    ...    
    25  yyyyy   1   NaN   14         Blue
    26  zzzzz   1   NaN   14         Blue
    

    最后的df应该像这样

        0       1   2     3  ....    1029
    0   aaaaa   1   NaN   14         Green 
    1   bbbbb   1   NaN   14         Green
    2   ccccc   1   NaN   14         Blue
    3   ddddd   1   NaN   14         Blue
    ...    
    25  yyyyy   1   NaN   14         Blue
    26  zzzzz   1   NaN   14         Green
    

    所以基本上需要发生的是 df1[0] df[2] 需要匹配,然后 df2[1029] 需要将值替换为中的相应行 df1[1029] 对于匹配的行。我不想失去任何价值观 df2['1029'] 不在里面的 df1['1029']

    我相信 re python中的模块能做到吗?这就是我目前为止所拥有的:

    import re
    for line in replace:
    line = re.sub(df1['1029'], 
                  '1029',
                  line.rstrip())
    
    print(line)
    

    但它肯定不起作用。

    我也可以使用merge as in merged1 = df1.merge(df2, left_index=True, right_index=True, how='inner') 但这并不能替换内联的值。

    2 回复  |  直到 7 年前
        1
  •  1
  •   Sociopath    7 年前

    df1 = pd.DataFrame({'0':['aaaaa','bbbbb','fffff','xxxxx','zzzzz'], '1029':['Green','Green','Blue','Blue','Green']})
    
    df2 = pd.DataFrame({'0':['aaaa','bbbb','ccccc','ddddd','yyyyy','zzzzz',], '1029':[None,None,'Blue','Blue','Blue','Blue']})
    
    
    # Fill NaNs
    df2['1029'] = df2['1029'].fillna(df1['1029'])
    
    # Merge the dataframes 
    df_ = df2.merge(df1, how='left', on=['0'])
    
    df_['1029'] = np.where(df_['1029_y'].isna(), df_['1029_x'], df_['1029_y'])
    
    df_.drop(['1029_y','1029_x'],1,inplace=True)
    print(df_)
    

           0   1029
    0   aaaa  Green
    1   bbbb  Green
    2  ccccc   Blue
    3  ddddd   Blue
    4  yyyyy   Blue
    5  zzzzz  Green
    
        2
  •  -1
  •   Ankur Paliwal    7 年前
    import pandas as pd
    import numpy as np
    df1 = pd.DataFrame({'0':['aa','bb','ff','xx', 'zz'], '1029':['Green', 'Green', 'Blue', 'Blue', 'Green']})
    df2 = pd.DataFrame({'0':['aa','bb','cc','dd','ff','gg','hh','xx','yy', 'zz'], '1': [1]*10, '2': [np.nan]*10, '1029':[np.nan, np.nan, 'Blue', 'Blue', np.nan, np.nan, 'Blue', 'Green', 'Blue', 'Blue']})
    df1
        0   1029
    0  aa  Green
    1  bb  Green
    2  ff   Blue
    3  xx   Blue
    4  zz  Green
    
    df2
        0  1   1029   2
    0  aa  1    NaN NaN
    1  bb  1    NaN NaN
    2  cc  1   Blue NaN
    3  dd  1   Blue NaN
    4  ff  1    NaN NaN
    5  gg  1    NaN NaN
    6  hh  1   Blue NaN
    7  xx  1  Green NaN
    8  yy  1   Blue NaN
    9  zz  1   Blue NaN
    

    df2.loc[(df2['1029'].isna() & df2['0'].isin(df1['0'])), '1029'] = df1['1029'][df2['0'].isin(df1['0'])].tolist()
    
    df2
        0  1   1029   2
    0  aa  1  Green NaN
    1  bb  1  Green NaN
    2  cc  1   Blue NaN
    3  dd  1   Blue NaN
    4  ff  1  Green NaN
    5  gg  1    NaN NaN
    6  hh  1   Blue NaN
    7  xx  1  Green NaN
    8  yy  1   Blue NaN
    9  zz  1   Blue NaN