pandas 使用Python截断并重新编号与特定ID/组对应的列

kpbwa7wx  于 2023-01-28  发布在  Python
关注(0)|答案(2)|浏览(194)

我在Python中给出了这样一个数据集:

#Load the required libraries
import pandas as pd

#Create dataset
data = {'id': [1, 1, 1, 1, 1,1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3],
        'runs': [6, 6, 6, 6, 6,6,7,8,9,10, 3, 3, 3,4,5,6, 5, 5,5, 5,5,6,7,8],
        'Children': ['No', 'Yes', 'Yes', 'Yes', 'No','No', 'Yes', 'Yes', 'Yes', 'No', 'Yes', 'Yes', 'No', 'Yes', 'Yes', 'Yes', 'Yes', 'Yes', 'No', 'Yes', 'No', 'Yes', 'Yes', 'No'],
        'Days': [123, 128, 66, 120, 141,123, 128, 66, 120, 141, 52,96, 120, 141, 52,96, 120, 141,123,15,85,36,58,89],
        }

#Convert to dataframe
df = pd.DataFrame(data)
print("df = \n", df)

上面的 Dataframe 如下所示:

这里,对于每个"id",我希望截断重复"runs"的列,并使编号在该id中连续。
例如,
对于id = 1,在6处截断"运行",并从1开始对数据集重新编号。
对于id = 2,在3处截断"运行",并从1开始对数据集重新编号。
对于id = 3,在5处截断"运行",并从1开始对数据集重新编号。
净结果应该是这样的:

有人能告诉我如何在python中完成这个任务吗?
我希望使用Python截断对应于特定ID/组的列并对其重新编号

pw9qyyiw

pw9qyyiw1#

locduplicated过滤掉重复项,然后用groupby.cumcount重新编号:

out = (df[~df.duplicated(subset=['id', 'runs'], keep=False)]
       .assign(runs=lambda d: d.groupby(['id']).cumcount().add(1))
       )

输出:

id  runs Children  Days
6    1     1      Yes   128
7    1     2      Yes    66
8    1     3      Yes   120
9    1     4       No   141
13   2     1      Yes   141
14   2     2      Yes    52
15   2     3      Yes    96
21   3     1      Yes    36
22   3     2      Yes    58
23   3     3       No    89
uwopmtnx

uwopmtnx2#

您可以创建一个循环来遍历每个idrun截止值,对于循环的每次迭代,通过原始 Dataframe 的id和run值确定 Dataframe 的新段,并将新 Dataframe 附加到最终 Dataframe 。

df_truncated = pd.DataFrame(columns=df.columns)
for id,run_cutoff in zip([1,2,3],[6,3,5]):
    df_chunk = df[(df['id'] == id) & (df['runs'] > run_cutoff)].copy()
    df_chunk['runs'] = range(1, len(df_chunk)+1)
    df_truncated = pd.concat([df_truncated, df_chunk])

结果:

id runs Children Days
6   1    1      Yes  128
7   1    2      Yes   66
8   1    3      Yes  120
9   1    4       No  141
13  2    1      Yes  141
14  2    2      Yes   52
15  2    3      Yes   96
21  3    1      Yes   36
22  3    2      Yes   58
23  3    3       No   89

相关问题