我有一个 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 条记录?
我建议熔化数据框然后调整相关行:
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