合并具有特定约束的几个pandas.DataFrame

时间:2018-05-11 22:28:21

标签: python pandas dataframe merge

假设我有3个不同的pandas dataFrames

>>>> df2 = pd.DataFrame({'PERSID': [20016, 50048, 13478, 68493, 57483, 45623],
                             'Sex': ['F', 'M', 'F', 'F', 'M', 'M'], 
                             'Var1': [3, *1*, 3, 3, 2, np.nan],
                             'Var2': [*3*, 3, np.nan, 3, 2, 0],
                             'Var3': [-0.25, 0, 4, np.nan, 0.14, 0.28]})
>>> df2.set_index('ID')

       Sex  Var1  Var2  Var3
PERSID                      
20016    F   3.0   3.0 -0.25
50048    M   1.0   3.0  0.00
13478    F   3.0   NaN  4.00
68493    F   3.0   3.0   NaN
57483    M   2.0   2.0  0.14
45623    M   NaN   0.0  0.28

第二个DF基本上是DF1的更新版本,这意味着更多行条目以及其他列,并且可能在某些其他列中更改了值,例如

   SUBJECT         Var4    Var5      Var6
200            1640.345   345.0 -0.250000
6700          14236.430  1713.0 -0.050735
6702           1345.400     NaN  0.034450
1330__201805    345.750   335.0  0.140000
4786__201805        NaN     0.0       NaN

作为示例的最后一个dataFrame应该与以下内容完全不同:

     ID Sex_x  Var1_x  Var2_x    Var3  Var1_y  Var2_y
  20016     F     3.0     2.0   -0.25     NaN     3.0
  50048     M     3.0     3.0    0.00     1.0     NaN
  13478     F     3.0     NaN    4.00     NaN     NaN
  68493     F     3.0     3.0     NaN     NaN     NaN
  57483     M     2.0     2.0    0.14     NaN     NaN
  45623     M     NaN     NaN    0.28     NaN     0.0

目标是将所有3个dataFrame合并为一个,包含所有非冗余信息。这意味着:

  1. 如果有新ID,只需添加行
  2. 如果有新列添加列
  3. 如果在两个不同的DF中存在确切的ID,则需要以这样的方式合并它们:如果单元格内容相同,则可以忽略第二DF的内容。但是,如果单元格的内容不同,则需要使用columnName.y添加新列,而需要将另一列重命名为columnName.x
  4. 考虑只合并DF1和DF2,它应该看起来像这样:

    df_combined = df_1.copy()
    for ind, column in enumerate(df_2):
        if not column in list(df_combined):
            df_combined.insert(len(df_combined.columns), column,
                               value=pd.Series(np.nan),
                               allow_duplicates=False)
    
    frame = [df_combined, df_2]
        df_combined = pd.concat(frame)
    

    然后应合并第3个DF,这将导致仅添加行和列。 其他DF中不存在的所有细胞应填充NaN

    如果像name.x和name.y这样的相应列彼此相邻以确保可读性,那就太棒了。

    我尝试了像pandas.DataFrame。(合并,连接和连接)之类的东西,尝试手工完成,但没有任何工作,因为它需要。

    这是我如何添加列的示例,如果它们不存在:

    TypeError: C:\Users\dlma1\Desktop\Nodejs Practice\znode-js-playlist\views\todo.ejs:17
        15|       <ul>
    
        16|         <% for(let i=0;i<todos.length;i++){ %>
    
     >> 17|           <li><%= todos[i].item %></li>
    
        18|         <% } %>
    
        19|       </ul>
    
        20|     </div>
    
    
    Cannot read property 'item' of undefined
    

    这可能已经不是一个好的解决方案了。

    感谢您提供有关如何实现此功能的任何帮助!

0 个答案:

没有答案