根据某些条件高效地复制 Pandas 中的记录[重复]

问题描述 投票:0回答:1

我有一个 pandas 数据框,其记录如下:

df = pd.DataFrame({
    'APPN': [1001, 1002, 1003, 1004, 1005, 1006],
    'Applct_Id_1': ['A', 'B', 'C', 'D', None, 'F'],
    'Applct_Id_2': [None, 'E', 'F', None, 'G', None],
    'Applct_Id_3': ['W', 'Z', None, 'Y', None],
    'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve', 'Frank'],
    'Age': [25, 30, 35, 40, 45, 50]
})

理想情况下,APPN 的所有值都是唯一的。然而,每个APPN中有不同的Applct_Id,如Applct_Id_1等。与 1001 一样,有 A (Applct_Id_1) 和 W (Applct_Id_3)。 Applct_Id_2 为 None,因此不感兴趣。我想要做的是复制 Applct_Id_1 和 Applct_Id_3 上第 1001 行的记录。我的想法是创建一个名为 ID_Number 的新列,并记录每个 APPN 的 Applct_Id_1 和 Applct_Id_3 的值,例如本示例中的 1001。接下来将是影响此 APPPN 的行的副本。我承认这对于其他 APPN 来说会有所不同。因此,记录的复制仅适用于数据集中记录了超过 1 个 Applct_Id 的 APPN。最后我想以 1001 为例实现类似的目标。

new_df = pd.DataFrame({
    'APPN': [1001, 1001],
    'ID_Number': ['A', 'W'],   
    'Name': ['Alice', 'Alice'],
    'Age': [25, 25]
})

如何在 Pandas 中高效地执行此操作,因为我将处理大约 400K 条记录?

python pandas
1个回答
0
投票

我建议熔化数据框然后调整相关行:

import pandas as pd

# Example DataFrame
df = pd.DataFrame({
    'APPN': [1001, 1002, 1003, 1004, 1005, 1006],
    'Applct_Id_1': ['A', 'B', 'C', 'D', None, 'F'],
    'Applct_Id_2': [None, 'E', 'F', None, 'G', None],
    'Applct_Id_3': ['W', 'Z', None, 'Y', None, None],
    'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve', 'Frank'],
    'Age': [25, 30, 35, 40, 45, 50]
})

melted_df = df.melt(id_vars=['APPN', 'Name', 'Age'], value_vars=['Applct_Id_1', 'Applct_Id_2', 'Applct_Id_3'], 
                    var_name='ID_Type', value_name='ID_Number')

melted_df = melted_df[melted_df['ID_Number'].notna()]
melted_df = melted_df.drop(columns=['ID_Type'])
melted_df = melted_df.sort_values(by=['APPN', 'ID_Number'])
print(melted_df)

这给出了

   APPN     Name  Age ID_Number
0   1001    Alice   25         A
12  1001    Alice   25         W
1   1002      Bob   30         B
7   1002      Bob   30         E
13  1002      Bob   30         Z
2   1003  Charlie   35         C
8   1003  Charlie   35         F
3   1004    David   40         D
15  1004    David   40         Y
10  1005      Eve   45         G
5   1006    Frank   50         F
© www.soinside.com 2019 - 2024. All rights reserved.