Добавить количество строк в полный фрагмент данных [дубликат]

У меня такая же проблема. Этот код хорошо работает в моем случае.

// Replace broken images by a default img
$('img').each(function(){
    if($(this).attr('src') === ''){
      this.src = '/default_feature_image.png';
    }
});
25
задан d1337 1 August 2013 в 14:11
поделиться

4 ответа

Результат df.groupby(...) не является DataFrame. Чтобы вернуть DataFrame, вам нужно применить функцию к каждой группе, преобразовать каждый элемент группы или фильтровать группы.

Кажется, что вам нужен DataFrame, содержащий (1) все ваши оригинальные данные в df и (2) подсчет количества данных в каждой группе. Эти вещи имеют разную длину, поэтому, если им нужно зайти в один и тот же DataFrame, вам нужно будет перечислять размер избыточно, т. Е. Для каждой строки в каждой группе.

df['size'] = df.groupby(['A','B']).transform(np.size)

(Кроме этого: это полезно, если вы можете показать сжатый ввод проб и ожидаемые результаты.)

18
ответ дан Dan Allan 20 August 2018 в 07:02
поделиться
  • 1
    yay, преобразуйте! – Andy Hayden 1 August 2013 в 14:19
  • 2
    Я также нашел это почти равным (создает новый фреймворк), но не уверен, как он сравнивается с вашим решением с точки зрения эффективности stackoverflow.com/questions/10373660/… – d1337 2 August 2013 в 02:22
  • 3
    Более того, ваше решение хорошо работает на примере игрушек, но по фактическим данным возвращается ошибка pastebin.com/aCsMxCd5 – d1337 2 August 2013 в 10:57
  • 4
    В пандах 20.3 работает @ jezraels df['size'] = df.groupby(['A','B']) .A .transform(np.size); без .A вы получаете & quot; ValueError: неправильное количество элементов, переданных 2, размещение подразумевает 1 & quot ;, т. е. получает 2 столбца, необходимо 1 & quot; , – denis 14 July 2017 в 16:35

Вам нужно transform size - len of df такое же, как и раньше:

import pandas as pd

df = pd.DataFrame({'A': ['x', 'x', 'x','y','y']
                , 'B': ['a', 'c', 'c','b','b']})
print (df)
   A  B
0  x  a
1  x  c
2  x  c
3  y  b
4  y  b

df['size'] = df.groupby(['A', 'B'])['A'].transform('size')
print (df)
   A  B  size
0  x  a     1
1  x  c     2
2  x  c     2
3  y  b     2
4  y  b     2

При необходимости имя столбца в агрегации df - len of df, очевидно, НЕ такое же, как и раньше:

import pandas as pd

df = pd.DataFrame({'A': ['x', 'x', 'x','y','y']
                , 'B': ['a', 'c', 'c','b','b']})
print (df)
   A  B
0  x  a
1  x  c
2  x  c
3  y  b
4  y  b

df = df.groupby(['A', 'B']).size().reset_index(name='Size')
print (df)
   A  B  Size
0  x  a     1
1  x  c     2
2  y  b     2
11
ответ дан jezrael 20 August 2018 в 07:02
поделиться
  • 1
    Хороший. Но как мне сделать то же самое, что и df.groupby(['A', 'B']).size().reset_index(name='Size') Если у меня есть несколько индексов? – Sotos 26 April 2018 в 12:20
  • 2
    @Sotos Если использовать последнюю версию панд, то же самое. – jezrael 26 April 2018 в 12:34
  • 3
    так что-то вроде ...reset_index('V1', name = 'size')? – Sotos 26 April 2018 в 12:38
  • 4
    @Sotos Хммм, это не работает. Необходимость .reset_index().rename(columns='index':'col', 'anothercol':'col2') – jezrael 26 April 2018 в 13:41
  • 5
    Именно это я и сделал в конце ... (full_df .set_index('cdatetime') .groupby(['Cluster', 'source', 'action', pd.Grouper(freq = 'H', sort = True)]) .size() .reset_index(['Cluster', 'source', 'action']) .rename(columns={0: 'cnt'}) ) – Sotos 26 April 2018 в 13:44

позволяет сказать, что n - это имя dataframe, а cst - это число элементов, которые повторяются. Ниже приведен код в следующем столбце

cstn=Counter(n.cst)
cstlist = pd.DataFrame.from_dict(cstn, orient='index').reset_index()
cstlist.columns=['name','cnt']
n['cnt']=n['cst'].map(cstlist.loc[:, ['name','cnt']].set_index('name').iloc[:,0].to_dict())

Надеюсь, что это сработает

0
ответ дан Kallol 20 August 2018 в 07:02
поделиться

Встроенный метод объектов .size() объектов DataFrameGroupBy фактически возвращает объект Series с размерами группы, а не DataFrame. Если вы хотите, чтобы DataFrame, чей столбец был размером группы, индексированный группами, с настраиваемым именем, вы можете использовать метод .to_frame() и использовать в качестве аргумента имя требуемого столбца.

grpd = df.groupby(['A','B']).size().to_frame('size')

Если вы хотите, чтобы группы были столбцами снова, вы могли бы добавить .reset_index() в конец.

23
ответ дан Sealander 20 August 2018 в 07:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: