我有一个数据集,每个参与者在一周内都有几个重复的测量值,我使用"groupby"one_answers".agg"函数对其进行聚合,以获得如下的第一个和最后一个测量值:
我有一个数据集,每个参与者在一周内都有几个重复的测量值,我使用"groupby"one_answers".agg"函数对其进行聚合,以获得如下的第一个和最后一个测量值:
df2=df.groupby("ID").agg(['first', 'last']).stack()
现在看起来是这样的:
| ID | | Age | Score | Measure |
| -- | ---- | --- | ----- | ------ |
| 0 | first| 69 | 48 | 34 |
| | last | 69 | 52 | 33 |
| 1 | first| 58 | 28 | 89 |
| | last | 58 | 14 | 34 |
我想使用第一个和最后一个值聚合创建一个数据集,以在Score和Measure变量的这些值之间创建差异。它应该是这样的:
| ID | Age | Score_diff | Measure_diff |
| -- | --- | ---------- | ------------ |
| 0 | 69 | 4 | 1 |
| 1 | 58 | 14 | 55 |
我不知道该如何处理(我是Python新手(。有人能帮我吗?
向致以最良好的祝愿
您可以尝试以下操作:
import pandas as pd
df2 = df.groupby("id").agg(['first', 'last']).stack().reset_index().set_index("id")
>>> df2
level_1 Age Score Measure
id
0 first 69 48 34
0 last 69 52 33
1 first 58 28 89
1 last 58 14 34
groupby("id")
,以便将以下函数应用于它们中的每一个,并将它们agg
应用于列表。
df3 = df2.groupby("id").agg(list)
df3["Age"] = df3["Age"].apply(lambda x: x[0]) # x[0] and x[1] are equal
>>> df3
level_1 Age Score Measure
id
0 [first, last] 69 [48, 52] [34, 36]
1 [first, last] 58 [28, 14] [89, 34]
然后应用lambda
函数来获得两个值之间的差。
df3["Score_diff"] = df3["Score"].apply(lambda x: abs(x[1] - x[0]))
df3["Measure_diff"] = df3["Measure"].apply(lambda x: abs(x[1] - x[0]))
并删除你不想要的列
df3 = df3.drop(columns=["level_1", "Score", "Measure"])
>>> df3
Age Score_diff Measure_diff
id
0 69 4 2
1 58 14 55
import pandas as pd
import numpy as np
你也可以这样做:
df=df.reset_index()
result=(df.groupby(['ID','Age'])
.agg(lambda x:abs(np.diff(x)))
.rename(columns=lambda x:x+'_diff')
.reset_index())
现在,如果你打印result
,你会得到:
ID Age Score_diff Measure_diff
0 69 4 1
1 58 14 55