Суммируйте строки из столбца на основе условия и выводите их в новый столбец

В моем фрейме данных я хочу суммировать определенные строки в столбце и вывести их в новый столбец «UE_more_days».

является

    ATEXT   BEGUZ_UE   UE_more_days
0             11.00            0.0
1     CT      23.00            Nan
2     RT      33.00           46.0
3             15.00            0.0
3             15.00            0.0
4             12.75            0.0
5             19.75            0.0
6             14.75            0.0
7     CT      23.00           29.5
8     CT      24.00           46.0
9     CT      24.00           48.0
10    RT      33.00           48.0
11            15.00            0.0
12
etc

должно быть

    ATEXT   BEGUZ_UE   UE_more_days
0
1     CT      23.00
2     RT      33.00           56.0
3             15.00
4             12.75
5             19.75
6             14.75
7     CT      23.00
8     CT      24.00
9     CT      24.00
10    RT      33.00          104.0
11            15.00
12
etc

должно быть 2

    ATEXT   BEGUZ_UE    subtract      add      UE_more_days  is_m_days
0             11.00     *0.00*        *3.92*
1     CT      *23.00*    0.00         0.00
2     RT      *33.00*    0.00         0.00          56.0
3             *15.00*    0.20         0.00                      *74.92*
4             12.75         
5             19.75
6             14.75     *2.00*       *0.00*
7     CT      *23.00*
8     CT      *24.00*
9     CT      *24.00*
10    TT      *33.00*                              104.0
11            *15.00*    0.00         3.57                     *117.00*
12
etc

моя последняя попытка

bedd2 = [(df['ATEXT'] != ''),]
result2 = [(df.iloc[0:]['BEGUZ_UE'].astype(float).reset_index(drop=True) +
df.iloc[1:]['BEGUZ_UE'].astype(float)).round(decimals=2).shift(1)]
df['min_UE_mehr_Tage'] = np.select(bedd2, result2)

Как я могу суммировать строки из столбца на основе условия и вывести их в новый столбец?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
167
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Замените на Nan значения в BEGUZ_UE, где ATEXT равно "", и после этого создайте группы по тому же условию.

m = df['ATEXT'].eq("")
cond = (~m) & m.shift(-1)
df['UE_more_days'] = (df['BEGUZ_UE'].mask(m)
                      .groupby(m.cumsum()).cumsum()
                      .where(cond)
                     )
tmv = (df[['subtract', 'add']]
       .shift()
       .groupby(m.cumsum())
       .transform('max')
       .eval('add-subtract')
      )


df['m_days'] = (df.groupby(m[::-1].cumsum())['BEGUZ_UE']
                .transform('sum')
                .add(tmv)
                .where(cond)
                .shift()
               )

Конечный результат:

   ATEXT  BEGUZ_UE  subtract   add  UE_more_days  m_days
0            11.00       0.0  3.92           NaN     NaN
1     CT     23.00       0.0  0.00           NaN     NaN
2     RT     33.00       0.0  0.00          56.0     NaN
3            15.00       0.2  0.00           NaN   74.92
4            12.75       NaN   NaN           NaN     NaN
5            19.75       NaN   NaN           NaN     NaN
6            14.75       2.0  0.00           NaN     NaN
7     CT     23.00       NaN   NaN           NaN     NaN
8     CT     24.00       NaN   NaN           NaN     NaN
9     CT     24.00       NaN   NaN           NaN     NaN
10    TT     33.00       NaN   NaN         104.0     NaN
11           15.00       0.0  3.57           NaN  117.00

Набор данных, который я использовал:

data = {'ATEXT': ['', 'CT', 'RT', '', '', '', '', 'CT', 'CT', 'CT', 'TT', ''], 
        'BEGUZ_UE': [11.0, 23.0, 33.0, 15.0, 12.75, 19.75, 14.75, 23.0, 
                     24.0, 24.0, 33.0, 15.0], 
        'subtract': [0.0, 0.0, 0.0, 0.2, np.nan, np.nan, 2.0, np.nan, 
                     np.nan, np.nan, np.nan, 0.0], 
        'add': [3.92, 0.0, 0.0, 0.0, np.nan, np.nan, 0.0, np.nan, np.nan, 
                np.nan, np.nan, 3.57], 
        'UE_more_days': [np.nan, np.nan, 56.0, np.nan, np.nan, np.nan, np.nan, 
                         np.nan, np.nan, np.nan, 104.0, np.nan]}

Большое спасибо, это работает. Еще одна вещь, которую я хотел бы знать: Строка 4: ... eq('RT') не является решающим фактором, а скорее eq('последний элемент каждой группы'). (последний элемент может быть = 'RT', 'CT' или другой).

mxplk 28.06.2024 13:14

Я изменил код. Теперь это должно работать с каждым значением.

Triky 28.06.2024 13:27

мой следующий шаг — фрейм данных «должно быть 2»: для каждой группы в «BEGUZ_UE»: «is_m_days» = (сумма «BEGUZ_UE» + «добавить» — «вычесть»)

mxplk 30.06.2024 11:58

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

Triky 30.06.2024 12:54
df1['target'] = df1['BEGUZ_UE'].where(df1['ATEXT'].isin(['CT', 'RT']))
df1['target'].fillna(0, inplace=True)

df1['group'] = (df1['ATEXT'] == 'RT').shift().fillna(0).cumsum()

df1['target_sum'] = df1.groupby('group')['target'].cumsum()
df1['last_UE_more_days'] = df1['target_sum'].where(df1['ATEXT'] == 'RT')

Конечный результат:

   ATEXT  BEGUZ_UE  UE_more_days  target  target_sum  last_UE_more_days
0            11.00           0.0     0.0         0.0                NaN
1     CT     23.00           NaN    23.0        23.0                NaN
2     RT     33.00          46.0    33.0        56.0               56.0
3            15.00           0.0     0.0         0.0                NaN
4            15.00           0.0     0.0         0.0                NaN
5            12.75           0.0     0.0         0.0                NaN
6            19.75           0.0     0.0         0.0                NaN
7            14.75           0.0     0.0         0.0                NaN
8     CT     23.00          29.5    23.0        23.0                NaN
9     CT     24.00          46.0    24.0        47.0                NaN
10    CT     24.00          48.0    24.0        71.0                NaN
11    RT     33.00          48.0    33.0       104.0              104.0
12           15.00           0.0     0.0         0.0                NaN

Задача, которую еще предстоит решить: Добавить в группу значения из другого столбца (значения 'BEGUZ_UE'), на одну строку выше (пустую в 'ATEXT') и одну строку ниже (тоже пустую в 'ATEXT') из группа. Я постараюсь найти решение!!

mxplk 28.06.2024 16:38

Мне что-то не хватало в полученном кадре данных. Могу удалить, но не могу найти выкройку.

windbreeze 28.06.2024 17:48

мой следующий шаг — фрейм данных «должно быть 2»: для каждой группы в «BEGUZ_UE»: «is_m_days» = (сумма «BEGUZ_UE» + «добавить» — «вычитать»)

mxplk 30.06.2024 11:59

Другие вопросы по теме