Еще не упоминается в этом потоке: начиная с C ++ 11, в списке инициализаторов членов может использоваться инициализация списка (ака. «равномерная инициализация», «согласованная инициализация»):
Foo(int num): bar{num} {}
, который имеет ту же семантику, что и инициализация списка в других контекстах.
Попробуйте это:
for name_grp, df_grp in df.groupby(["TYPE", "RESV"]):
df1 = df_grp[['WELL', 'RESV', 'TYPE', 'X1', 'Y1', 'TD2']]
df2 = df_grp[['WELL', 'X2', 'Y2']]
df2.columns = ['WELL', 'X1', 'Y1']
df3 = pd.concat([df1, df2], sort=True).sort_values(['WELL', 'TD2']).fillna(method='ffill')
df3 = df3.reset_index(drop = True)[['WELL', 'RESV', 'TYPE', 'X1', 'Y1', 'TD2']]
for i, x in df3.groupby('WELL'):
x.to_csv(str(i) + '.csv')
Вы можете использовать pd.concat()
и apply()
после переименования некоторых столбцов:
def reformat(x):
return pd.concat([x[['WELL','X1','Y1','TD2']], x[['WELL','X2','Y2','TD2']].rename(columns={'X2': 'X1', 'Y2': 'Y1'})], axis=0).sort_values('WELL')
out = df.groupby(['TYPE','RESV']).apply(reformat).reset_index().drop('level_2', axis=1)
Выход:
TYPE RESV WELL X1 Y1 TD2
0 INJ B W2 120 255 695
1 INJ B W2 700 -7 695
2 INJ B W6 200 275 1495
3 INJ B W6 1500 -15 1495
4 INJ B W8 240 285 1895
5 INJ B W8 1900 -19 1895
6 OBS A W5 180 270 1295
7 OBS A W5 1300 -13 1295
8 OBS A W7 220 280 1695
9 OBS A W7 1700 -17 1695
10 OBS B W3 140 260 895
11 OBS B W3 900 -9 895
12 OP A W1 100 250 495
13 OP A W1 500 -5 495
14 OP A W9 260 290 2095
15 OP A W9 2100 -21 2095
16 OP B W4 160 265 1095
17 OP B W4 1100 -11 1095