python - Pandas groupby中的条件分配

标签 python pandas dataframe group-by

假设我在下面有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

关于python - Pandas groupby中的条件分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61593358/

相关文章:

python - 使用 str.contains 选择包含搜索词列表中所有字符串的数据帧行

python - 如何从 python 访问自定义 swift 或 Objective C 框架

python - 使用 matplotlib 子图时减少行之间的间隙?

python - 如何解析多个 n 大小的数组中的单个 csv 文件列?

Python Pandas 绘制多索引指定 x 和 y

python - 如何在条件中用另一列值替换一列值

python - pandas DataFrame 类型转换

python - 从 DataFrame 中选择属于同一系列的行的最后一次观察

python - 新S3下的Boto3文件夹同步 'folder'

python - 如何在分组依据后检查列是否包含特定元素?