pandas 根据持续时间重新整形框架

7rtdyuoh  于 11个月前  发布在  其他
关注(0)|答案(2)|浏览(96)

我想重新塑造一个框架到一个框架与以下规则:
1.用ts + dur在当前ts下添加一行,复制其他列
1.将“无”行添加到下一行。
举例说明:

import pandas as pd
import itertools

def segments(df):
    start = df['ts']
    end = start + df['dur']
    lst = list(zip(start, end, itertools.cycle([None])))
    return lst

df = pd.DataFrame({
    'ts':   [1, 5, 10 ],
    'dur':  [1, 2, 1 ],
    'typ':  [0, 1, 0]
})
print(df)
lst = segments(df)
print(lst)

字符串
当前输出是一个列表:

ts  dur  typ
0   1    1    0
1   5    2    1
2  10    1    0
[(1, 2, None), (5, 7, None), (10, 11, None)]


预期产出:

ts  typ
0  1    0
1  2    0
2  NA   NA
3  5    1
4  7    1
5  NA   NA
6  10   0
7  11   0
8  NA   NA

6qfn3psc

6qfn3psc1#

IIUC,无需自定义函数,只需将DataFrame复制3次,并进行小修改,concatsort_index

out = (pd.concat([df[['ts', 'typ']],
                  df.eval('ts = ts+dur')[['ts', 'typ']],
                  df[[]]
                 ])
         .sort_index(ignore_index=True)
      )

字符串
输出量:

ts  typ
0   1.0  0.0
1   2.0  0.0
2   NaN  NaN
3   5.0  1.0
4   7.0  1.0
5   NaN  NaN
6  10.0  0.0
7  11.0  0.0
8   NaN  NaN


如果你有一个非常大的DataFrame,你可以用以下步骤来代替排序步骤:

N = len(df)
a = np.arange(N)
order = np.tile(3*a, N)+np.repeat(a, 3)

out = (pd.concat([df[['ts', 'typ']],
                  df.eval('ts = ts+dur')[['ts', 'typ']],
                  df[[]]
                 ])
         .iloc[order].reset_index(drop=True)
      )

68bkxrlz

68bkxrlz2#

尝试:

df["ts"] = df.apply(lambda row: [row["ts"], row["ts"] + row["dur"], np.nan], axis=1)
df = df.explode("ts").drop(columns="dur").reset_index(drop=True)
df["typ"] = np.where(df["ts"].isna(), np.nan, df["typ"])

print(df)

字符串
印刷品:

ts  typ
0    1  0.0
1    2  0.0
2  NaN  NaN
3    5  1.0
4    7  1.0
5  NaN  NaN
6   10  0.0
7   11  0.0
8  NaN  NaN

相关问题