Как сгруппировать панды DataFrame, если некоторые значения представляют собой диапазон целых чисел, а другие - чистые целые числа? - PullRequest
1 голос
/ 10 июня 2019

Я хочу сгруппировать df по столбцу col_2, который содержит в основном integers, но некоторые ячейки содержат диапазон целых чисел . В моем примере из реальной жизни каждое уникальное целое число представляет определенный серийный номер собранной детали. Каждая строка в кадре данных представляет одну часть, которая выделяется собранной части на col_2. Некоторые детали могут быть отнесены только к собранной детали с заданной неопределенностью (диапазоном).
Ожидаемый результат будет одна одна группа для каждого ссылочного целого числа (собранная часть S / N). Например, запись col_1 = c должна быть выделена для обеих групп, где col_2 = 1 и col_2 = 2.


df = pd.DataFrame( {'col_1': ['a', 'b', 'c', 'd', 'e', 'f'],
                    'col_2': [1, 2, range(1,3), 3,range(2,5),5]})

  col_1      col_2
0     a          1
1     b          2
2     c     (1, 2)
3     d          3
4     e  (2, 3, 4)
5     f          5

print(df.groupby(['col_2']).groups)

Приведенный выше код выдает ошибку:

TypeError: '<' не поддерживается между экземплярами 'range' и 'int' </p>

Ответы [ 2 ]

1 голос
/ 10 июня 2019

Я думаю, что это то, что вы хотите:

s = df.col_2.apply(pd.Series).set_index(df.col_1).stack().astype(int)
s.reset_index().groupby(0).col_1.apply(list)

Первый шаг дает вам:

col_1   
a      0    1
b      0    2
c      0    1
       1    2
d      0    3
e      0    2
       1    3
       2    4
f      0    5

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

1       [a, c]
2    [b, c, e]
3       [d, e]
4          [e]
5          [f]
0 голосов
/ 10 июня 2019

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

df = pd.DataFrame( {'col_1': ['a', 'b', 'c', 'd', 'e', 'f'],
                    'col_2': [1, 2, range(1,3), 3,range(2,5),5]})

  col_1      col_2
0     a          1
1     b          2
2     c     (1, 2)
3     d          3
4     e  (2, 3, 4)
5     f          5
df['col_2'] = df.col_2.map(lambda x: range(x) if type(x) != range else x)
print(df.groupby(['col_2']).groups)```
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...