更新我的问题以使其更清晰。 我有一个包含多列/行的CSV文件。 我这样读了
in_csv = pd.read_csv(inputFileName.csv)
一般来说,列的格式为
Col1,Col2,Col3,JK,KK,...,Def1, Def_1x,Def_1y,Def2,Def_2x,Def_2y
某些行的值包含Def1
,Def_1x
,Def_1y
,Def2
,Def_2x
,Def_2y
。其他行仅包含Def1
,Def_1x
,Def_1y
中的值。
我想在另一个csv中输出如下:
Col1,Col2,Col3,JK,KK,...,Def1,Def_1x,Def_1y
列(无Def2
,Def_2x
,Def_2y
)row_i
在Def_2x
,Def_2y
中没有值,则会在输出csv中复制相同的行(不包括最后三个列)row_j
具有Def_2x
,Def_2y
中的值,则将其拆分为输出csv中的两行。一行Def1
,Def_1x
,Def_1y
,第二行Def2
,Def_2x
,Def_2y
复制到Def1
输出csv的{},Def_1x
,Def_1y
示例输入:
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,.....,,,
行的顺序与A1
,A2
,A2
,A3
,A4
相同。拆分行后,副本就在下面,而不是在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,.....,,,,
非常感谢。
答案 0 :(得分:0)
使用concat()
来堆叠X
和Y
条目。
将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
分隔X
和Y
条目,然后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