根据条件递归合并行 pandas 数据框
recursively merging rows pandas dataframe based on the condition
社区,
我有一个排序的 pandas 数据框,如下所示:
我想合并在 start 和 end 列中具有重叠值的行。这意味着如果初始行的 end 值大于顺序行或任何其他顺序行的 start 值,它们将合并为一行.例如第 3、4 和 5 行。我期望的输出是:
为此,我正在尝试实现递归函数,它将遍历数据帧直到条件起作用,然后 return 给我一个数字,用于搜索结束行的位置。
但是,我尝试实现的功能 return 是空数据框。你能帮我吗,我应该把注意力放在哪里,或者如果递归不是解决方案,我可以建立什么替代方案?
def row_merger(pd_df):
counter = 0
new_df = pd.DataFrame(columns=pd_df.columns)
for i in range(len(pd_df) - 1):
def recursion_inside(pd_df, counter = 0):
counter = 0
if pd_df.iloc[i + 1 + counter]["q.start"] <= pd_df.iloc[i]["q.end"]:
counter = counter+1
recursion_inside(pd_df, counter)
else:
return counter
new_row = {"name": pd_df["name"][i], "q.start": pd_df.iloc[i]
["q.start"], "q.end": pd_df.iloc[i+counter]["q.start"]}
new_df.append(new_row, ignore_index=True)
return new_df
我在这里看不到使用递归的好处,所以我只是遍历行,为输出数据帧逐行构建行,例如像这样:
def row_merger(df_in):
if len(df_in) <= 1:
return df_in
rows_out = []
current_row = df_in.iloc[0].values
for next_row in df_in.iloc[1:].values:
if next_row[1] > current_row[2]:
rows_out.append(current_row)
current_row = next_row
else:
current_row[2] = max(current_row[2], next_row[2])
rows_out.append(current_row)
return pd.DataFrame(rows_out, columns=df_in.columns)
社区,
我有一个排序的 pandas 数据框,如下所示:
我想合并在 start 和 end 列中具有重叠值的行。这意味着如果初始行的 end 值大于顺序行或任何其他顺序行的 start 值,它们将合并为一行.例如第 3、4 和 5 行。我期望的输出是:
为此,我正在尝试实现递归函数,它将遍历数据帧直到条件起作用,然后 return 给我一个数字,用于搜索结束行的位置。
但是,我尝试实现的功能 return 是空数据框。你能帮我吗,我应该把注意力放在哪里,或者如果递归不是解决方案,我可以建立什么替代方案?
def row_merger(pd_df):
counter = 0
new_df = pd.DataFrame(columns=pd_df.columns)
for i in range(len(pd_df) - 1):
def recursion_inside(pd_df, counter = 0):
counter = 0
if pd_df.iloc[i + 1 + counter]["q.start"] <= pd_df.iloc[i]["q.end"]:
counter = counter+1
recursion_inside(pd_df, counter)
else:
return counter
new_row = {"name": pd_df["name"][i], "q.start": pd_df.iloc[i]
["q.start"], "q.end": pd_df.iloc[i+counter]["q.start"]}
new_df.append(new_row, ignore_index=True)
return new_df
我在这里看不到使用递归的好处,所以我只是遍历行,为输出数据帧逐行构建行,例如像这样:
def row_merger(df_in):
if len(df_in) <= 1:
return df_in
rows_out = []
current_row = df_in.iloc[0].values
for next_row in df_in.iloc[1:].values:
if next_row[1] > current_row[2]:
rows_out.append(current_row)
current_row = next_row
else:
current_row[2] = max(current_row[2], next_row[2])
rows_out.append(current_row)
return pd.DataFrame(rows_out, columns=df_in.columns)