使用pandas

时间:2017-12-07 07:04:19

标签: python pandas numpy merge

我有两个数据框df1和df2

df1有以下数据(N行)

  Time(s)   sv-01 sv-02 sv-03  Val1  val2  val3 
   1339.4   1     4      12     1.6   0.6   1.3
   1340.4   1     12     4     -0.5  0.5   1.4
   1341.4   1     6      8      0.4   5     1.6
   1342.4   2     5     14      1.2   3.9    11
   ......           .....      ....   ...    ..

df2有以下数据,其行数多于df1

Time(msec)   channel  svid    value-1   value-2 valu-03
1000          1       2       0          5       1
1000          2       5       1          4       2
1000          3       2       3          4       7
.....         .....................................
1339400      1        1       1.6        0.4     5.3
1339400      2        12      0.5       1.8      -4.4
1339400      3        4       -0.20     1.6      -7.9
1340400      1        1      0.3       0.3      1.5
1340400      2        6      2.3      -4.3      1.0
1340400      3        4      2.0       1.1      -0.45
1341400      1       1       2         2.1      0
1341400      2       8       3.4      -0.3       1
1341400      3       6       0         4.1      2.3
....       ....      ..      ...        ...      ...

我想要实现的是

1.首先将Time(s)列乘以1000,使其与df2匹配 毫秒柱。

2.在df1 sv 01,02和03是独立的列,但那些sv是 存在于svid下的同一列中。

所以目标是当df1的时间(改变之后)与时间匹配时 df2复制下三个连续行,即复制所有匹配的 那个时刻的线条。

基本上我想在df2时间列中迭代df1的时间 如果匹配复制三个下一行并复制到新的df。

我见过使用pandas merge函数的例子但在我的情况下都有 不同的标题。

感谢。

1 个答案:

答案 0 :(得分:1)

我认为您需要加倍boolean indexing - 首先df2isin,使用多个mul

然后按cumcount计算每个组的值并过滤前3:

df = df2[df2['Time(msec)'].isin(df1['Time(s)'].mul(1000))]
df = df[df.groupby('Time(msec)').cumcount() < 3]
print (df)
    Time(msec)  channel  svid  value-1  value-2  valu-03
3      1339400        1     1      1.6      0.4     5.30
4      1339400        2    12      0.5      1.8    -4.40
5      1339400        3     4     -0.2      1.6    -7.90
6      1340400        1     1      0.3      0.3     1.50
7      1340400        2     6      2.3     -4.3     1.00
8      1340400        3     4      2.0      1.1    -0.45
9      1341400        1     1      2.0      2.1     0.00
10     1341400        2     8      3.4     -0.3     1.00
11     1341400        3     6      0.0      4.1     2.30

详情:

print (df.groupby('Time(msec)').cumcount())
3     0
4     1
5     2
6     0
7     1
8     2
9     0
10    1
11    2
dtype: int64