合并间隔和时间戳数据帧

2024-04-25 10:06:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一张包含间隔的表

dfa = pd.DataFrame({'Start': [0, 101, 666], 'Stop': [100, 200, 1000]})

我有另一个包含时间戳和值的表

dfb = pd.DataFrame({'Timestamp': [102, 145, 113], 'ValueA': [1, 2, 21],
'ValueB': [1, 2, 21]})

我需要创建一个与dfa大小相同的数据帧,为dfb中的所有行添加一个包含StartStop之间的Timestamp聚合结果的列。你知道吗

因此,如果将我的聚合定义为

{'ValueA':[np.nanmean,np.nanmin],
'ValueB':[np.nanmax]}

我想要的结果是:

ValueA   ValueA    ValueB
nanmean  nanmin    nanmax    Start      Stop

nan      nan       nan        0          100
8        1         21         101        200
nan      nan       nan        666        1000

Tags: dataframe间隔npnanstarttimestamppdstop
1条回答
网友
1楼 · 发布于 2024-04-25 10:06:46

^{}与由^{}创建的辅助列交叉连接使用:

d = {'ValueA':[np.nanmean,np.nanmin],
     'ValueB':[np.nanmax]}

df = dfa.assign(A=1).merge(dfb.assign(A=1), on='A', how='outer')

然后按StartStop过滤并按字典聚合:

df = (df[(df.Timestamp >= df.Start) & (df.Timestamp <= df.Stop)]
         .groupby(['Start','Stop']).agg(d))

join将多索引展平map

df.columns = df.columns.map('_'.join)
print (df)
            ValueA_nanmean  ValueA_nanmin  ValueB_nanmax
Start Stop                                              
101   200                8              1             21

最后^{}到原文:

df = dfa.join(df, on=['Start','Stop'])
print (df)
   Start  Stop  ValueA_nanmean  ValueA_nanmin  ValueB_nanmax
0      0   100             NaN            NaN            NaN
1    101   200             8.0            1.0           21.0
2    666  1000             NaN            NaN            NaN

编辑:

^{}溶液:

d = {'ValueA':[np.nanmean,np.nanmin],
     'ValueB':[np.nanmax]}

#if not default index create it
dfa = dfa.reset_index(drop=True)
print (dfa)
   Start  Stop
0      0   100
1    101   200
2    666  1000

#add to bins first value of Start
bins = np.insert(dfa['Stop'].values, 0, dfa.loc[0, 'Start'])
print (bins)
[   0  100  200 1000]

#binning
dfb['id'] = pd.cut(dfb['Timestamp'], bins=bins, labels = dfa.index)
print (dfb)
   Timestamp  ValueA  ValueB id
0        102       1       1  1
1        145       2       2  1
2        113      21      21  1

#aggregate and flatten
df = dfb.groupby('id').agg(d)
df.columns = df.columns.map('_'.join)

#add to dfa
df = pd.concat([dfa, df], axis=1)
print (df)
   Start  Stop  ValueA_nanmean  ValueA_nanmin  ValueB_nanmax
0      0   100             NaN            NaN            NaN
1    101   200             8.0            1.0           21.0
2    666  1000             NaN            NaN            NaN

相关问题 更多 >