Цикл по группам, чтобы сделать операцию на

Еще не упоминается в этом потоке: начиная с C ++ 11, в списке инициализаторов членов может использоваться инициализация списка (ака. «равномерная инициализация», «согласованная инициализация»):

Foo(int num): bar{num} {}

, который имеет ту же семантику, что и инициализация списка в других контекстах.

0
задан ooikiam 22 March 2019 в 20:35
поделиться

2 ответа

Попробуйте это:

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')
0
ответ дан Kai Aeberli 22 March 2019 в 20:35
поделиться

Вы можете использовать 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
0
ответ дан rahlf23 22 March 2019 в 20:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: