组合行+Groupby/apply函数



我有如下数据帧(数据帧1(:

ID  Group   Start   End
0   ID1   A       1      2
1   ID1   A       2      3
2   ID1   A       3      4
3   ID1   B       4      5
4   ID1   B       5      6
5   ID2   A       6      7
6   ID2   A       7      8
7   ID2   B       8      9
8   ID2   B       9     10
9   ID2   B       11    12

我想创建新的数据帧,如果唯一ID的End值等于另一行的Start值,则应该将其合并为一行(ID必须在同一组中(。所以,我想要这样的东西(数据帧2(:

ID  Group   Start   End
0   ID1   A       1      4
3   ID1   B       4      6
5   ID2   A       6      8
7   ID2   B       8      10
9   ID2   B       11     12

现在对我来说太复杂了。所以首先我想了一些关于groupby和application的事情。我在每组中将End列移动了一个(向下(,并检查Start值与End_shifted值的相等次数(我也可以在稍后的数据集分析中使用它,所以它并没有那么无用(。所以我写了函数:

def mygroup(df):

is_continued = 0

df['End'] = df['End'].shift(1)
for index, row in df.iterrows():
if (row['Start'] == row['End']):
is_continued = is_continued + 1

return is_continued

然后:

is_continued = dataframe.groupby(['ID']).apply(mygroup)

我以为它会给我4个ID1和4个ID2,但不是。

ID
ID1    4
ID2    0
dtype: int64

所以我的问题是。

  1. groupby/apply我做错了什么
  2. 如何组合这些行以获得数据帧2

我对熊猫几乎没有经验,因此(1(我无法回答你的第一个问题,(2(就你的第二个问题而言,这可能不是专家会做的。但我提供它作为解决方案:

import pandas as pd

def combine_rows(df):
id = []
group = []
start = []
end = []
prev_row = None
for index, row in df.iterrows():
if prev_row is None:
prev_row = row
prev_end = prev_row.End
continue
if row.ID == prev_row.ID and row.Group == prev_row.Group and row.Start == prev_end:
prev_end = row.End
else:
id.append(prev_row.ID)
group.append(prev_row.Group)
start.append(prev_row.Start)
end.append(prev_end)
prev_row = row
prev_end = prev_row.End
if prev_row is not None:
id.append(prev_row.ID)
group.append(prev_row.Group)
start.append(prev_row.Start)
end.append(prev_end)
return pd.DataFrame({"ID": id, "Group": group, "Start": start, "End": end})

df = pd.DataFrame({
"ID": ['ID1', 'ID1', 'ID1', 'ID1', 'ID1', 'ID2', 'ID2', 'ID2', 'ID2', 'ID2'],
"Group": ['A', 'A', 'A', 'B', 'B', 'A', 'A', 'B', 'B', 'B'],
"Start": [1, 2, 3, 4, 5, 6, 7, 8, 9, 11],
"End": [2, 3, 4, 5, 6, 7, 8, 9, 10, 12]
})
print(df)
df = combine_rows(df)
print(df))

打印:

ID Group  Start  End
0  ID1     A      1    2
1  ID1     A      2    3
2  ID1     A      3    4
3  ID1     B      4    5
4  ID1     B      5    6
5  ID2     A      6    7
6  ID2     A      7    8
7  ID2     B      8    9
8  ID2     B      9   10
9  ID2     B     11   12
ID Group  Start  End
0  ID1     A      1    4
1  ID1     B      4    6
2  ID2     A      6    8
3  ID2     B      8   10
4  ID2     B     11   12

最新更新