我有一个如下所示的示例:
col1 col2 Name_1 Gender_1 Age_1 I#2_Name I#2_Gender I#2_Age Unique_Col
A1 50 Amy F 20 NaN NaN NaN Key_01
A2 20 Judy F 35 Andy M 37 Key_02
A3 10 James M 45 Alice F 45 Key_03
A4 150 Sam M 23 NaN NaN NaN Key_04
A5 200 Annie F 40 John NaN NaN Key_05
如果有第二个名字,我想将数据帧从一行拆分为两行。
col1 col2 Name_new Gender_new Age_new Unique_Col
A1 50 Amy F 20 Key_01_N1
A2 20 Judy F 35 Key_02_N1
A2 20 Andy M 37 Key_02_N2
A3 10 James M 45 Key_03_N1
A3 10 Alice F 45 Key_03_N2
A4 150 Sam M 23 Key_04_N1
A5 200 Annie F 40 Key_05_N1
A5 200 John NaN NaN Key_05_N2
有时,第二性别和年龄存在缺失值。
有什么想法吗?
最佳答案
您可以使用pivot_longer来自pyjanitor reshape 数据:
(df.pivot_longer(index = ['col1', 'col2', 'Unique_Col'],
names_to = ['Name_new', 'Gender_new', 'Age_new'],
names_pattern = ['Name', 'Gender', 'Age'],
sort_by_appearance = True)
)
col1 col2 Unique_Col Name_new Gender_new Age_new
0 A1 50 Key_01 Amy F 20.0
1 A1 50 Key_01 NaN NaN NaN
2 A2 20 Key_02 Judy F 35.0
3 A2 20 Key_02 Andy M 37.0
4 A3 10 Key_03 James M 45.0
5 A3 10 Key_03 Alice F 45.0
6 A4 150 Key_04 Sam M 23.0
7 A4 150 Key_04 NaN NaN NaN
8 A5 200 Key_05 Annie F 40.0
9 A5 200 Key_05 John NaN NaN
在上面的代码中,您将新列名称的列表传递给 names_to
。对于每个新列名称,您将一个模式(正则表达式)传递给 names_pattern
。因此,对于 Names_new
,该函数将搜索包含 Name
的任何列,并将所有数据拉入该列,Gender_new
也是如此, Age_new
。
您也可以只使用 pandas 并使用 wide_to_long ;首先对列重新排序,使 Gender
、Name
和 Age
位于前面:
new_df = df.rename(columns = lambda col: "_".join(col.split("_")[::-1])
if "#" in col else col)
new_df
col1 col2 Name_1 Gender_1 Age_1 Name_I#2 Gender_I#2 Age_I#2 Unique_Col
0 A1 50 Amy F 20 NaN NaN NaN Key_01
1 A2 20 Judy F 35 Andy M 37.0 Key_02
2 A3 10 James M 45 Alice F 45.0 Key_03
3 A4 150 Sam M 23 NaN NaN NaN Key_04
4 A5 200 Annie F 40 John NaN NaN Key_05
让我们 reshape :
(pd.wide_to_long(new_df,
stubnames = ['Name', 'Gender', 'Age'],
i = ['col1', 'col2', 'Unique_Col'],
j = 'suffix',
sep = "_",
suffix = ".+")
.droplevel("suffix")
.reset_index()
)
col1 col2 Unique_Col Name Gender Age
0 A1 50 Key_01 Amy F 20.0
1 A1 50 Key_01 NaN NaN NaN
2 A2 20 Key_02 Judy F 35.0
3 A2 20 Key_02 Andy M 37.0
4 A3 10 Key_03 James M 45.0
5 A3 10 Key_03 Alice F 45.0
6 A4 150 Key_04 Sam M 23.0
7 A4 150 Key_04 NaN NaN NaN
8 A5 200 Key_05 Annie F 40.0
9 A5 200 Key_05 John NaN NaN
关于python - 将行分成两列并保持其他列相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67170293/