Python: Как дополнить нулями?

#python #pandas #numpy #zero-padding

#python #pandas #numpy #заполнение нулями

Вопрос:

Предполагая, что у нас есть фрейм данных, как показано ниже:

 df = pd.DataFrame({ 'Col1' : ['a', 'a', 'a', 'a', 'b', 'b', 'c', 'c'],
        'col2' : ['0.5', '0.78', '0.78', '0.4', '2', '9', '2', '7',]
        })
  

Я подсчитал количество строк для всех уникальных значений в col1 . Например, a имеет 4 строки, b и c имеет по 2 строки в каждой, выполняя:

 df.groupby(['Col1']).size()
  

и я получаю вывод в виде

 Col1
a    4
b    2
c    2
dtype: int64
  

После того, как это будет сделано, я хотел бы проверить, какой из a, b, c имеет максимальное количество строк (в данном случае, a имеет максимальное количество строк), и дополнить остальные ( b и c ) разницей между максимальным значением и имеющимися у них строками, нулями (оба b и c имеют по 2 строки в каждой, а поскольку 4 — максимальное количество строк, я хочу дополнить b и c еще 2 нулями). Нули должны быть добавлены в конце.

Я хочу дополнить его нулями, так как хочу применить окно фиксированного размера ко всем переменным (a, b, c) для построения графиков.

Ответ №1:

Вы можете создать счетчик с помощью GroupBy.cumcount , create MultiIndex и DataFrame.reindex по всем комбинациям, созданным MultiIndex.from_product :

 df1 = df.set_index(['Col1', df.groupby('Col1').cumcount()])

mux = pd.MultiIndex.from_product(df1.index.levels, names=df1.index.names)
df2 = df1.reindex(mux, fill_value=0).reset_index(level=1, drop=True).reset_index()
print (df2)
   Col1  col2
0     a   0.5
1     a  0.78
2     a  0.78
3     a   0.4
4     b     2
5     b     9
6     b     0
7     b     0
8     c     2
9     c     7
10    c     0
11    c     0
  

Ответ №2:

Та же логика, что и у Jez, использующего cumcount , но с stack и unstack цепочкой

 df.assign(key2=df.groupby('Col1').cumcount()).set_index(['Col1','key2']).unstack(fill_value=0).stack().reset_index('Col1')
Out[1047]: 
     Col1  col2
key2           
0       a   0.5
1       a  0.78
2       a  0.78
3       a   0.4
0       b     2
1       b     9
2       b     0
3       b     0
0       c     2
1       c     7
2       c     0
3       c     0