【问题标题】:iteratively merging varying number of rows迭代合并不同数量的行
【发布时间】:2021-08-28 05:28:16
【问题描述】:

在@Joe Ferndz 的帮助下进行的早期讨论: merging varying number of rows and columns by multiple conditions in python

数据集的样子

         connector   type   q_text     a_text     var1
   1        1111      1      aaaa       None      xxxx  
   2        9999      2      None       tttt      jjjj
   3        1111      2      None       uuuu      None
   4        9999      1      bbbb       None      yyyy  
   5        9999      1      cccc       None      zzzz  

逻辑将每一行与type = 1 合并到其对应的(connector 中的相同值)type = 2。执行此操作的代码:

df.loc[df['type'] == 2, 'var1.1'] = df['var1']
my_cols = ['q_text','a_text','var1']
df[my_cols] = df.sort_values(['connector','type']).groupby('connector')[my_cols].transform(lambda x: x.bfill())
df.dropna(subset=['q_text'], inplace=True)
df.reset_index(drop=True,inplace=True)

数据集的样子

         connector   q_text      a_text      var1    var1.1
   1        1111      aaaa        uuuu       xxxx     None 
   2        9999      bbbb        tttt       yyyy     jjjj  
   3        9999      cccc        None       zzzz     zzzz  

问题,多行具有type = 1,但只有一行具有type = 2connector 值相同)。因此我最终需要多次合并type = 2 行。

问题为什么只合并一行?

数据集应该是什么样子(比较第 3 行的值,你会明白我的意思)

         connector   q_text      a_text      var1    var1.1
   1        1111      aaaa        uuuu       xxxx     None 
   2        9999      bbbb        tttt       yyyy     jjjj  
   3        9999      cccc        tttt       zzzz     jjjj  

a_text 遵循左连接逻辑,可以在不添加额外列的情况下覆盖值。相反,var1 值对于行连接器值是非排他性的,这就是为什么我希望为这些值 (jjjj) 提供额外的列 (var1.1)。有些行具有唯一的 connector 值,永远不会被合并,但我想保留它们。

【问题讨论】:

  • 复制您的示例数据集,然后运行您的代码/逻辑不会生成您在上面(how the dataset then looks like 部分)中显示的数据集
  • 对于类型 2,q_text 总是 None,对于类型 1 行,a_text always None?
  • 是的,q_text 对于 type = 2 行始终为 None,a_text 对于 type = 1 行始终为 None。我不小心 subset=['a_text'] 而不是 q_text 并现在编辑它。
  • 好吧,不确定你的逻辑,但你想要的可以使用 pandas 中的合并操作来完成。发布了一个答案来向您展示这一点。

标签: python-3.x pandas merge iteration


【解决方案1】:

您想将带有type = 1 的行合并到带有type = 2 的行,但是在您展示的代码/逻辑中不涉及使用pandas.merge 方法,这实际上会满足您的需求。

首先将带有type = 1type = 2 的行分成2 个不同的数据框df1df2。然后简单地将这 2 个数据框合并到 connector 值上。它将自动映射 df1 中具有 type = 1 的多行,而 df2 中只有一个具有 type = 2 的行(具有相同的连接器值)。此外,由于您希望保留具有永远不会合并的唯一连接器值的行,请使用 how='outer' 参数执行外部 merge 并保留所有值。

合并后,选择你最终想要的所有列并相应地重命名它们:

df1 = df.loc[df.type == 1].copy()
df2 = df.loc[df.type == 2].copy()
merged_df = pd.merge(df1, df2, on='connector', how='outer')
merged_df = merged_df.loc[:,['connector','q_text_x','a_text_y','var1_x','var1_y']]
merged_df.rename(columns={'q_text_x':'q_text','a_text_y':'a_text','var1_x':'var1','var1_y':'var1.1'}, inplace=True)


>>> merged_df
   connector q_text a_text  var1 var1.1
0       1111   aaaa   uuuu  xxxx   None
1       9999   bbbb   tttt  yyyy   jjjj
2       9999   cccc   tttt  zzzz   jjjj

【讨论】:

    猜你喜欢
    • 2022-11-17
    • 1970-01-01
    • 2017-04-21
    • 2017-07-10
    • 2023-03-15
    • 1970-01-01
    • 2019-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多