提取Pandas datafram的一个子集

2024-09-27 00:17:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这样一个数据帧:

Name   ID   Level
Name1   A     1
Name2   B     2
Name3   C     3
Name4   D     1
Name5   E     2
Name6   F     1

等等。。。在

我正在寻找一种方法,根据名称标准只提取此数据帧的一个子节。所以我想从Name4开始提取所有内容,直到组中最后一个人的名字是另一个级别1,即从Name4提取到Name5,因为Name6是一个级别1。在

或者作为另一个例子,我想从Name1提取到Name3,因为Name4是一个级别1。在

我可以在Excel中用一个宏来完成这个任务…找到Name1,查看Level列,如果它不是1,那么就获取这行数据,一直到你再次找到一个级别为1的名称,然后停止,然后输出这个部分

希望这有道理。在


Tags: 数据方法name名称id标准级别level
3条回答

你可以这样做:

创建一个保存Group值的新列'Group',然后可以groupby此列

g = 0
for i in df.index:
    if df.loc[i, "Level"] == 1:
        g += 1
    df.loc[i, "Group"] = g

这将把所需的Name放在一个地方-

df.groupby(df.groupby(['Level']).cumcount())['Name'].apply(lambda x: ','.join(x))

0    Name1,Name2,Name3
1          Name4,Name5
2                Name6
Name: Name, dtype: object

现在您可以根据需要为每个实体设置Level/操作apply()函数中的lambda以实现它

使用此数据帧:

In [0]: df
Out[0]: 
    Name ID  Level
0  Name1  A      1
1  Name2  B      2
2  Name3  C      3
3  Name4  D      1
4  Name5  E      2
5  Name6  F      1

使用指示行是否处于某个级别(目标级别)的辅助列/系列。 target_lvl = 1

^{pr2}$

现在,您可以获取映射每个子集开始和结束的范围列表:

^{pr3}$

注意^{cd2>}的值是属于^{{cd3>}的每一行的索引。

最后,您只需要从^{cd2>}中提取子集:

^{pr4}$

相关问题 更多 >

    热门问题