Pandas数据框重组

3
我有以下Pandas数据框,它显示了塔中台阶的坐标,包括z-min和z-max:

enter image description here

import pandas as pd

names = ['T1', 'T2', 'T2', 'T1', 'T1']
coord = [0, 0, 5, 50, 70]


df = pd.DataFrame([names , coord ], index=['Name', 'Cord']).T  

导致:
  Name Cord
0    T1   0
1    T2   0
2    T2   5
3    T1   50
4    T1   70

对于每一个独特的坐标,我想重新分组所有塔,这些塔的z-max小于或等于该坐标。因此:
     Name      Cord
0    T1,T2      0
1    T1,T2      5
2    T1         50
3    T1         70

我该怎么做?

我已经做了什么

按唯一坐标分组:

import numpy as np

g = df.groupby('Cord')['Name'].apply(lambda x: list(np.unique(x)))

我理解为:

Cord
0     [T1, T2]
5         [T2]
50        [T1]
70        [T1]

...但是除此之外,我不确定。

编辑

提出的答案对于两座塔的z-min值不相同时无法解决:

import pandas as pd

names = ['T1', 'T2', 'T2', 'T1', 'T1']
coord = [0, 5, 10, 50, 70]


df = pd.DataFrame([names , coord ], index=['Name', 'Cord']).T

为什么在50时是T1,T2,但在70时只有T1 - Quang Hoang
1
我是唯一一个不明白的人吗? - Mykola Zotko
1个回答

2
让我们尝试数据透视表:
(df.pivot(index='Cord', columns='Name', values='Name')
   .bfill().apply(lambda x: list(x.dropna()), axis=1)
)

输出:

Cord
0     [T1, T2]
5     [T1, T2]
50        [T1]
70        [T1]
dtype: object
解释: 首先,我们将表格透视,使其看起来类似于您的图片:
df.pivot(index='Cord', columns='Name', values='Name')

这将会给出:

Name   T1   T2
Cord          
0      T1   T2
5     NaN   T2
50     T1  NaN
70     T1  NaN

因此,您可以在所有Cord级别上看到塔楼,除了它们是自下而上的。现在我们使用bfill来填充缺失的中间级别,例如T1上的5

最后,我们想要沿着行进行聚合,这意味着使用applyaxis=1。Lambda函数是自说明的(我希望如此)。


更新: 对于更新后的数据,我们需要从第一个非NaN值开始使用bfill

(df.pivot(index='Cord', columns='Name', values='Name')
   .apply(lambda x: x[x.notna().cumsum().ne(0)].bfill())
   .apply(lambda x: list(x.dropna()), axis=1)
)

输出:

Cord
0         [T1]
5     [T1, T2]
10    [T1, T2]
50        [T1]
70        [T1]
dtype: object

哇,这相当令人印象深刻。您能在回复中简要概述一下代码正在做什么吗?谢谢! - henry
嗨,我更新了我的问题:你觉得你能再看一下吗?谢谢! - henry

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接