DataFrames Python: объединить значения столбцов в соответствии с определенным условием - PullRequest
0 голосов
/ 02 ноября 2018

Привет, у меня есть вопрос о фрейме данных. Допустим, у меня есть датафрейм в таком формате

label    value 
1        a
1        b 
2  
2 
1        c
1        d

Итак, теперь у меня есть две последовательные части метки 1. Я хочу иметь такой вывод:

output: [ab,cd] 

Какие связанные значения меток 1 разных областей объединены вместе. Спасибо.

Ответы [ 4 ]

0 голосов
/ 02 ноября 2018

Вы можете попробовать

-> группирование кадра данных по последовательности меток и добавление сгруппированного значения

-> сгруппировать фрейм данных по меткам, чтобы получить информацию об отдельных идентификаторах в виде списка

Рассмотренный фрейм данных

    label   value
0   1   a
1   1   b
2   2   NaN
3   2   NaN
4   1   c
5   1   d
6   1   e
7   3   b
8   3   c

#grouping the dataframe by label sequence checking with the previous value
df['value1'] = df.groupby(df.label.diff(1).abs().cumsum().fillna(0)).transform(sum)['value']

0    4.0
1    4.0
2    3.0
3    3.0
4    2.0
5    2.0
6    2.0
7    0.0
8    0.0

#group the dataframe by label to get individual ids information as list
df.groupby(df.label).apply(lambda x: x['value1'].unique())

Из:

      label
1    [ab, cde]
2        [0.0]
3         [bc]
dtype: object
0 голосов
/ 02 ноября 2018

Вы можете попытаться суммировать значения в value на основе условия двух последовательных меток '1s', выполнив:

>> df['label'] = df['label'].astype(str)

>> res = df + df.shift(-1)

  label value
0    11    ab
1    12   NaN
2    22   NaN
3    21   NaN
4    11    cd
5   NaN   NaN

Затем мы просто фильтруем res строки, где label соответствует '11':

>> res[res['label'].eq('11')]['value'].values.tolist()

['ab', 'cd']
0 голосов
/ 02 ноября 2018

С Pandas вы можете фильтровать ваш фрейм данных по label. Затем используйте GroupBy с серией группировщиков, построенных с использованием cumsum:

grouper = df['label'].ne(df['label'].shift()).cumsum()

res = df.loc[df['label'] == 1]\
        .groupby(grouper)['value'].sum().tolist()

['ab', 'cd']
0 голосов
/ 02 ноября 2018

Вы можете использовать itertools.groupby, который группирует только смежные элементы:

from itertools import groupby
from operator import itemgetter

zipper = zip(df['label'], df['value'])
grouper = groupby(list(zipper), key=itemgetter(0))
res = [''.join(map(itemgetter(1), j)) for i, j in grouper if i == 1]

['ab', 'cd']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...