我的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"])
答案 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