воспроизводить / разбивать строки на основе значения поля - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть dataframe как:

id        date     value
1         2016     3
2         2016     1
1         2018     1
1         2016     1.1

Теперь я хочу воспроизвести строки по какой-то странной причине с помощью логики:

if value > 1
    reproduce row value times - 1
    with value = 1
    or fraction left for last unit

для лучшего понимания рассмотрим только 1-й ряд dataframe, т.е.:

id        date     value
1         2016     3

, который я разбил на 3 строки как:

id        date     value
1         2016     1
1         2016     1
1         2016     1

но рассмотрим последнюю строку, т. Е .:

id        date     value
1         2016     1.1

Который разбит как:

id        date     value
1         2016     1
1         2016     0.1

т.е. если есть какая-то дробь, то она разбивается отдельно, иначе в одной единице

, а затем группировать по идентификатору и сортировать по дате, очевидно, просто.

т.е. новый dataframe будет выглядеть так:

id        date     value
1         2016     1
1         2016     1
1         2016     1
1         2016     1
1         2016     0.1
1         2018     1
2         2016     1

Основная проблема - воспроизведение строк.

ОБНОВЛЕНО

Образец dataframe код:

df = pd.DataFrame([[1,2018,5.1],[2,2018,2],[1,2016,1]], columns=["id", "date", "value"])

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

генератор

def f(df):
  for i, *t, v in df.itertuples():
    while v > 0:
      yield t + [min(v, 1)]
      v -= 1

pd.DataFrame([*f(df)], columns=df.columns)

   id  date  value
0   1  2018    1.0
1   1  2018    1.0
2   1  2018    1.0
3   1  2018    1.0
4   1  2018    1.0
5   1  2018    0.1
6   2  2018    1.0
7   2  2018    1.0
8   1  2016    1.0
0 голосов
/ 12 сентября 2018

Используя // и% с pandas repeat

s1=df.value//1
s2=df.value%1
s=pd.concat([s1.loc[s1.index.repeat(s1.astype(int))],s2[s2!=0]]).sort_index()
s.loc[s>=1]=1
newdf=df.reindex(df.index.repeat((s1+(s2).ne(0)).astype(int)))  
newdf['value']=s.values
newdf
Out[236]:
   id  date  value
0   1  2016    1.0
0   1  2016    1.0
0   1  2016    1.0
1   2  2016    1.0
2   1  2018    1.0
3   1  2016    1.0
3   1  2016    0.1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...