根据字段值重现/中断行

时间:2018-09-12 03:58:53

标签: python-3.x pandas pandas-groupby

我的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

为了更好地理解,请仅考虑dataframe的第一行,即:

id        date     value
1         2016     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

即如果有任何分数,则将其分开破碎,否则分成一个单位

然后按ID分组并按日期排序显然很容易。

即新的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 :(得分:6)

发电机

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

答案 1 :(得分:4)

将//和%与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