groupby ,然后将特定行转换为同一数据框中的列
groupby , Then convert the specific rows to coulmns in the same dataframe
首先我有这个数据框:
ID
Age
name
time
0
1
12
r
y
1
1
13
c
y
2
1
14
n
y
3
1
15
m
y
4
2
11
l
N
5
2
22
k
N
6
2
33
r
N
7
2
55
l
N
首先我想按 ID 分组(所以我会有第 1 组和第 2 组)
然后从按 ID 分组的数据框中的 [年龄] 列,我只需要前 2 行和最后一行每个 gorup 。所以对于 [Age] 列中的第 (1) 组,我需要第一行 = 12,第二行 = 13,最后一行 = 15。当然,我组 2 也需要做同样的事情
对于按数据框分组的 [name] 和 [time] 的其余列,我仅 需要最后一行 ,因此对于组 (1),从 [name] 列我需要最后一行,即 = m,从 [time] 列我需要最后一行 = y.
到最后,每个 ID 只占一行
这是我的 expected/desired 输出:
ID
Age 1
Age 2
Age 3
name
time
0
1
12
13
15
m
Y
1
2
11
22
55
l
N
试试 groupby
和 pivot
:
#keep only the needed data
grouped = df.groupby("ID", as_index=False).agg({"Age": lambda x: x.tolist()[:2]+[x.iat[-1]], "name": "last", "time": "last"}).explode("Age")
#get the count for the age columns
grouped["idx"] = grouped.groupby("ID").cumcount().add(1)
#pivot to get the required structure
output = grouped.pivot(["ID","name","time"],"idx","Age").add_prefix("Age").reset_index().rename_axis(None, axis=1)
>>> output
ID name time Age1 Age2 Age3
0 1 m y 12 13 15
1 2 l N 11 22 55
df1 = df.groupby('ID').agg({'Age':lambda x:list(np.r_[x.head(2),x.tail(1)])})
df1[['name', 'time']] = df.groupby('ID')[['name', 'time']].last()
df1[['Age1', 'Age2', 'Age3']] = pd.DataFrame(df1['Age'].to_list(), index = df1.index)
df1.drop('Age', axis = 1).reset_index()
ID name time Age1 Age2 Age3
0 1 m y 12 13 15
1 2 l N 11 22 55
首先我有这个数据框:
ID | Age | name | time | |
---|---|---|---|---|
0 | 1 | 12 | r | y |
1 | 1 | 13 | c | y |
2 | 1 | 14 | n | y |
3 | 1 | 15 | m | y |
4 | 2 | 11 | l | N |
5 | 2 | 22 | k | N |
6 | 2 | 33 | r | N |
7 | 2 | 55 | l | N |
首先我想按 ID 分组(所以我会有第 1 组和第 2 组)
然后从按 ID 分组的数据框中的 [年龄] 列,我只需要前 2 行和最后一行每个 gorup 。所以对于 [Age] 列中的第 (1) 组,我需要第一行 = 12,第二行 = 13,最后一行 = 15。当然,我组 2 也需要做同样的事情
对于按数据框分组的 [name] 和 [time] 的其余列,我仅 需要最后一行 ,因此对于组 (1),从 [name] 列我需要最后一行,即 = m,从 [time] 列我需要最后一行 = y.
到最后,每个 ID 只占一行
这是我的 expected/desired 输出:
ID | Age 1 | Age 2 | Age 3 | name | time | |
---|---|---|---|---|---|---|
0 | 1 | 12 | 13 | 15 | m | Y |
1 | 2 | 11 | 22 | 55 | l | N |
试试 groupby
和 pivot
:
#keep only the needed data
grouped = df.groupby("ID", as_index=False).agg({"Age": lambda x: x.tolist()[:2]+[x.iat[-1]], "name": "last", "time": "last"}).explode("Age")
#get the count for the age columns
grouped["idx"] = grouped.groupby("ID").cumcount().add(1)
#pivot to get the required structure
output = grouped.pivot(["ID","name","time"],"idx","Age").add_prefix("Age").reset_index().rename_axis(None, axis=1)
>>> output
ID name time Age1 Age2 Age3
0 1 m y 12 13 15
1 2 l N 11 22 55
df1 = df.groupby('ID').agg({'Age':lambda x:list(np.r_[x.head(2),x.tail(1)])})
df1[['name', 'time']] = df.groupby('ID')[['name', 'time']].last()
df1[['Age1', 'Age2', 'Age3']] = pd.DataFrame(df1['Age'].to_list(), index = df1.index)
df1.drop('Age', axis = 1).reset_index()
ID name time Age1 Age2 Age3
0 1 m y 12 13 15
1 2 l N 11 22 55