将每行拆分为多行合并列

时间:2017-08-24 17:19:56

标签: python pandas csv dataframe

更新我的问题以使其更清晰。 我有一个包含多列/行的CSV文件。 我这样读了

in_csv = pd.read_csv(inputFileName.csv)

一般来说,列的格式为

Col1,Col2,Col3,JK,KK,...,Def1, Def_1x,Def_1y,Def2,Def_2x,Def_2y

某些行的值包含Def1Def_1xDef_1yDef2Def_2xDef_2y。其他行仅包含Def1Def_1xDef_1y中的值。 我想在另一个csv中输出如下:

  1. 新行包含Col1,Col2,Col3,JK,KK,...,Def1,Def_1x,Def_1y列(无Def2Def_2xDef_2y
  2. 如果输入csv中的row_iDef_2xDef_2y中没有值,则会在输出csv中复制相同的行(不包括最后三个列)
  3. 如果输入csv中的row_j具有Def_2xDef_2y中的值,则将其拆分为输出csv中的两行。一行Def1Def_1xDef_1y,第二行Def2Def_2xDef_2y复制到Def1输出csv的{},Def_1xDef_1y
  4. 将行拆分为两行后,保持相同的行顺序
  5. 所有最后6列的行为空,保持原样
  6. 示例输入:

    Col1,Col2,Col3,JK,KK,...,Def1, Def_1x,Def_1y,Def2,Def_2x,Def_2y
    A1,B1,C1,....,a,0.2,0.3,,,
    A2,B2,C2,.....,b,0.4,0.5,b,0.6,0.7
    A3,B3,C3,.....,b,0.8,0.9,,,
    A4,B4,C4,.....,,,,,,
    

    预期产出:

    Col1,Col2,Col3,JK,KK,...,Def1, Def_1x,Def_1y
    A1,B1,C1,....,a,0.2,0.3
    A2,B2,C2,.....,b,0.4,0.5
    A2,B2,C2,.....,b,0.6,0.7
    A3,B3,C3,.....,b,0.8,0.9
    A4,B4,C4,.....,,,
    

    行的顺序与A1A2A2A3A4相同。拆分行后,副本就在下面,而不是在csv的底部。

    如果我可以添加另一个列(RANK),如下所示,这将是一个非常值得赞赏的奖励。对于非拆分行,它基本上总是1。对于分为两行的行,1:2。

    Col1,Col2,Col3,JK,KK,...,RANK,Def1, Def_1x,Def_1y
    A1,B1,C1,....,1,a,0.2,0.3
    A2,B2,C2,.....,1,b,0.4,0.5
    A2,B2,C2,.....,2,b,0.6,0.7
    A3,B3,C3,.....,1,b,0.8,0.9
    A4,B4,C4,.....,,,,
    

    非常感谢。

2 个答案:

答案 0 :(得分:0)

使用concat()来堆叠XY条目。

df作为Pandas数据框:

  Col1 Col2   X1   X2   Y1   Y2
0   A1   B1  0.2  0.3  NaN  NaN
1   A2   B2  0.4  0.5  0.6  0.7

分隔XY条目,然后concat()

y_cols = ['Y1','Y2']
x_cols = ['X1','X2']
non_y_cols = df.columns[~df.columns.isin(y_cols)]
non_x_cols = df.columns[~df.columns.isin(x_cols)]
pd.concat([df[non_y_cols], 
           df[non_x_cols].dropna().rename(columns={'Y1':'X1','Y2':'X2'})])

  Col1 Col2   X1   X2
0   A1   B1  0.2  0.3
1   A2   B2  0.4  0.5
1   A2   B2  0.6  0.7

答案 1 :(得分:0)

这是一种方法

In [1580]: pd.concat(
             [df.loc[:,cols.str.contains(p)]
                .rename(columns={'Y1':'X1','Y2':'X2'})
                .dropna() for p in ['Col|X', 'Col|Y']],
             ignore_index=True)
Out[1580]:
  Col1 Col2   X1   X2
0   A1   B1  0.2  0.3
1   A2   B2  0.4  0.5
2   A2   B2  0.6  0.7