pandas组中的条件赋值,由
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pandas组中的条件赋值,由相关的知识,希望对你有一定的参考价值。
假设我有 df
下面。
df = pd.DataFrame({
'ID': ['a', 'b', 'b', 'c', 'c', 'c', 'd', 'd', 'd', 'd'],
'V': np.array(range(0,10))
})
我想 groupby
的 ID
变量,并为新列赋值 X
取决于(1)每组的大小,以及每行是否是顶(T
)、"中间"(更像是在上下之间)(M
)或底部(B
)行。如果一个组中只有一行,那么分配的值是 N
. 在这种情况下,结果会是这样的。
ID V X
0 a 0 N
1 b 1 T
2 b 2 B
3 c 3 T
4 c 4 M
5 c 5 B
6 d 6 T
7 d 7 M
8 d 8 M
9 d 9 B
我可以分步完成这个任务,使用类似的方法(对于... T
案)。)
df.join(df.groupby('ID').filter(lambda x: len(x)>1).groupby('ID').head(1).assign(X='T').X, how='left')
但感觉这不是个好办法 我宁可一气呵成。有什么好办法吗?
答案
从你的逻辑来看,这是直接的。
groups = df.groupby('ID')
first = groups['V'].head(1).index
last = groups['V'].tail(1).index
# the default middle values
df['X'] = 'M'
# the top and bottom values
df.loc[first, 'X'] = 'T'
df.loc[last, 'X'] = 'B'
# the unique values
ones = groups['V'].transform('size') == 1
df.loc[ones, 'X'] = 'N'
输出。
ID V X
0 a 0 N
1 b 1 T
2 b 2 B
3 c 3 T
4 c 4 M
5 c 5 B
6 d 6 T
7 d 7 M
8 d 8 M
9 d 9 B
另一答案
一种方法是将每行的ID和前后的ID进行比较。
比如说,将每一行的ID与它前后的ID进行比较。
df["top"] = df.ID != df.shift().ID
df["bottom"] = df.ID != df.shift(-1).ID
df["mid"] = (df.ID == df.shift(-1).ID) & (df.ID == df.shift(1).ID)
这样的结果是:
ID V bottom top mid
0 a 0 True True False
1 b 1 False True False
2 b 2 True False False
3 c 3 False True False
4 c 4 False False True
5 c 5 True False False
6 d 6 False True False
7 d 7 False False True
8 d 8 False False True
9 d 9 True False False
现在你可以使用任何你想要的逻辑来创建TBMN列。
df.loc[df.bottom & (~df.mid), "V"] = "B"
df.loc[df.top & (~df.mid), "V"] = "T"
df.loc[df.mid, "V"] = "M"
df.loc[df.bottom & df.top, "V"] = "N"
df[["ID", "V"]]
结果是:
ID V
0 a N
1 b T
2 b B
3 c T
4 c M
5 c B
6 d T
7 d M
8 d M
9 d B
以上是关于pandas组中的条件赋值,由的主要内容,如果未能解决你的问题,请参考以下文章
JMeter:逻辑控制器_模块控制器(Module Controller)
pandas使用groupby.last函数获取每个组中的最后一个值实战:groupby.last函数获取每个组中的最后一个值groupby.nth函数获取每个组中的最后一个值