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))
})

我想 groupbyID 变量,并为新列赋值 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组中的条件赋值,由的主要内容,如果未能解决你的问题,请参考以下文章

Pandas 发现至少存在于两组中的值

JMeter:逻辑控制器_模块控制器(Module Controller)

pandas使用groupby.last函数获取每个组中的最后一个值实战:groupby.last函数获取每个组中的最后一个值groupby.nth函数获取每个组中的最后一个值

Pandas每组中的前n个值[重复]

Pandas:按两列分组,将第一列组中的第一个值相加

根据堆叠条件为具有层次索引的 pandas DataFrame 赋值