У меня есть фреймворк Pandas с несколькими столбцами (предположим, в следующем формате, чтобы упростить пример): -

Item        Interval    Specs
Chocolate      0        0.001
Chocolate      3        0.002
Chocolate      5        0.007
Milk           0        0.004
Milk           2        0.008
....

Что я хотел бы сделать, так это создать повторяющиеся строки для каждой из исходных строк в фрейме данных, в котором значение Interval равно 0, и иметь это для других случаев Interval со значением из Interval изменено. Например, Item Шоколад в исходном фрейме данных имеет 3 случая с Interval 0, 3 and 5. В случае, когда Interval равно 0, я хотел бы продублировать эти строки и оставить значение Specs таким же, но только изменить значение Interval и создать 2 дублирующих копии, то есть с помощью Interval значения 3 и 5. Аналогично для Milk Item я хочу создать 1 повторяющуюся строку с изменением Interval на 2. (Количество создаваемых повторяющихся строк напрямую зависит от количество уникальных значений Interval для отдельных Item).

Ожидаемый фрейм данных:

Item        Interval    Specs
Chocolate      0        0.001
Chocolate      3        0.002
Chocolate      5        0.007
Chocolate      3        0.001   --Duplicate row added and Interval value changed
Chocolate      5        0.001   --Duplicate row added and Interval value changed
Milk           0        0.004 
Milk           2        0.008   
Milk           2        0.004   --Duplicate row added and Interval value changed

Аналогичный вопрос (Повторяющиеся строки на основе значения с условием) на SO фокусируется на создании повторяющихся строк на основе условия, но не на изменении значений в кадре данных, соответствующих другим строкам. Мы будем очень благодарны за любые предложения о том, как это сделать.

0
JChat 23 Ноя 2021 в 16:31

1 ответ

Мы можем сделать это, сначала создав 2 фрейма данных:

  1. DF со строками, имеющими интервал как 0
  2. DF со строками, имеющими интервал не 0

Затем мы можем создать словарь фрейма данных с интервалом 0. Используя этот словарь, мы можем обновить значение спецификации другого фрейма данных. Затем обновленный фрейм данных объединяется с исходным фреймом данных. Код приведен ниже -

rows = [['Chocolate', 0, 0.001],
    ['Chocolate', 3, 0.002],
    ['Chocolate', 5, 0.007],
    ['Milk', 0, 0.004],
    ['Milk', 2, 0.008]]

df = pd.DataFrame(rows, columns=['Item', 'Interval', 'Specs']) # original dataframe

df1 = df[df['Interval'].ne(0)].copy() # dataframe with rows having interval other than 0
df2 = df[df['Interval'].eq(0)].copy() # dataframe with rows having interval 0

di = pd.Series(df2['Specs'].values, index=df2['Item']).to_dict()

for key, val in di.items():
    df1.loc[df1.Item == key, 'Specs'] = val

res = pd.concat([df, df1], ignore_index=True).sort_values('Item')
0
JEFFRIN JACOB 23 Ноя 2021 в 18:03