Я не уверен, насколько серьезна эта проблема. Но у меня возникли проблемы, и мне нужна помощь:

У меня есть образец фрейма данных pandas следующим образом (скажем):

       df 

     C   A      V   D
     9  apar    1   0
     8  bpar    4   8
     7  cpar    7   7
     0  apar    8   6
     8  apar    9   4
     9  bpar    3   2

Итак, что мне нужно сделать, это добавить существующий фрейм данных, так как всякий раз, когда у меня есть 'A' col имеет 'apar', затем создать новое значение как 'apar_t', а также изменить значение 'V' на say (0.5) и обновите фрейм данных. Итак, в этом примере с игрушкой мой фрейм данных должен выглядеть так:

    df

       C    A       V     D
       9    apar    1.0   0
       8    bpar    4.0   8
       7    cpar    7.0   7
       0    apar    8.0   6
       8    apar    9.0   4
       9    bpar    3.0   2
       9    apar_t  0.5   0
       0    apar_t  7.5   6
       8    apar_t  8.5   4

Я занимался и мог решить эту проблему, но я думаю, что это не питонический и не настолько эффективный для огромного набора данных. Я запрошу, могу ли я найти лучший способ решить проблему;

Я сделал следующее:

       sub_df = df[df['A']=='apar']
       colsOrder = df.columns
       sub_df = sub_df.rename(columns={'A': 'A1', 'V': 'V1'})

       sub_df['A'] ='apar_t'
       sub_df['V'] = sub_df['V1'] - 0.5

       sub_df.drop(columns=['A1', 'V1'])
       sub_df = sub_df[colsOrder]

       frames =[df,sub_df]
       DF = pd.concat(frames).reset_index(drop=True)
       DF

Код работает, и я получаю то, что хочу. Но я искал более элегантное питоническое и эффективное решение. Любая помощь будет оценена по достоинству.

1
Stan 5 Май 2021 в 01:34

2 ответа

Лучший ответ

Это чистый способ сделать это в случае, когда вы только добавляете или вычитаете значения из значений строки:

pd.concat([df, df.loc[df.A == 'apar'].apply(
    lambda row: row.add([0, '_t', -0.5, 0]), axis=1)])

Кадр данных:

   C       A    V  D
0  9    apar  1.0  0
1  8    bpar  4.0  8
2  7    cpar  7.0  7
3  0    apar  8.0  6
4  8    apar  9.0  4
5  9    bpar  3.0  2
0  9  apar_t  0.5  0
3  0  apar_t  7.5  6
4  8  apar_t  8.5  4

В противном случае вы можете определить функцию для преобразования вашей строки:

def transform_row(row):
    row['A'] = row['A'] + '_t'
    row['V'] = row['V'] - 0.5
    return row

А затем используйте apply

pd.concat([df, df.loc[df.A == 'apar'].apply(transform_row, axis=1)])

Результирующий фрейм данных идентичен приведенному выше.

1
Branden Ciranni 4 Май 2021 в 23:43
x = df.loc[df.A == "apar"].copy()
x.loc[:, "V"] = x.loc[:, "V"] - 0.5
x.loc[:, "A"] = x.loc[:, "A"] + "_t"
out = pd.concat([df, x])
print(out)

Печать:

   C       A    V  D
0  9    apar  1.0  0
1  8    bpar  4.0  8
2  7    cpar  7.0  7
3  0    apar  8.0  6
4  8    apar  9.0  4
5  9    bpar  3.0  2
0  9  apar_t  0.5  0
3  0  apar_t  7.5  6
4  8  apar_t  8.5  4
1
Andrej Kesely 4 Май 2021 в 22:48