python - 将行分成两列并保持其他列相同

标签 python pandas dataframe data-manipulation

我有一个如下所示的示例:

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 ;首先对列重新排序,使 GenderNameAge 位于前面:

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/

相关文章:

python - 如何分析sklearn-pipeline的中间步骤?

python - 无法导入名称 'MultiRNNCell'

python - 使用 Python 对 Excel 列进行排序

python - 根据列的条件从单个数据帧中提取多个不同的数据帧

python - 从 Pandas 数据框中的字符串列中删除b''

python - 从 pandas 数据框中进行多线绘图时,绘图没有实线

python - 将多索引列除以总和以创建百分比

python - 如何将索引转换为列表?

python - 如何在Python中查找不属于样本的值?

python - Pandas- 以值是否大于 0 为条件将一列除以另一列?