首页 > 解决方案 > 在 pandas apply 方法中,根据条件复制行

问题描述

这是我的df的一个例子:

pd.DataFrame([["1", "2"], ["1", "2"], ["3", "other_value"]],
                     columns=["a", "b"])
    a   b
0   1   2
1   1   2
2   3   other_value

我想达到这个:

pd.DataFrame([["1", "2"], ["1", "2"], ["3", "other_value"], ["3", "row_duplicated_with_edits_in_this_column"]],
                     columns=["a", "b"])
    a   b
0   1   2
1   1   2
2   3   other_value
3   3   row_duplicated_with_edits_in_this_column

规则是使用 apply 方法,进行一些检查(为了保持示例简单,我不包括这些检查),但在某些条件下,对于 apply 函数中的某些行,复制该行,对该行进行编辑并在 df 中插入两行。

所以像:

def f(row):
   if condition:
      row["a"] = 3
   elif condition:
      row["a"] = 4
   elif condition:
      row_duplicated = row.copy()
      row_duplicated["a"] = 5 # I need also this row to be included in the df

   return row
df.apply(f, axis=1)

我不想将重复的行存储在我班级的某个地方并在最后添加它们。我想即时进行。

我见过这个pandas: apply function to DataFrame 可以返回多行,但我不确定 groupby 是否可以在这里帮助我。

谢谢

标签: pythonpandas

解决方案


这是df.iterrows在列表推导中使用的一种方法。您需要将行附加到循环中,然后进行连接。

def func(row):
   if row['a'] == "3":
        row2 = row.copy()
        # make edits to row2
        return pd.concat([row, row2], axis=1)
   return row

pd.concat([func(row) for _, row in df.iterrows()], ignore_index=True, axis=1).T

   a            b
0  1            2
1  1            2
2  3  other_value
3  3  other_value

我发现在我的情况下最好没有,ignore_index=True因为我后来合并了 2 个 dfs。


推荐阅读