【问题标题】:two different csv file data manipulation using pandas使用 pandas 进行两种不同的 csv 文件数据操作
【发布时间】:2017-12-07 07:04:19
【问题描述】:

我有两个数据框 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.first 将 Time(s) 列乘以 1000,使其与 df2 匹配 毫秒列。

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

所以目标是 df1(更改后)的时间与时间匹配 df2 复制接下来的三个连续行,即复制所有匹配的 那一瞬间的线条。

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

我见过使用 pandas 合并功能的示例,但在我的情况下,两者都有 不同的标题。

谢谢。

【问题讨论】:

    标签: python pandas numpy merge


    【解决方案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
    

    【讨论】:

    • @Poka - 是的,没问题 ;)
    • 你能查一下df = df2[df2['Time(msec)'].isin(df1['Time(s)'].round(1).mul(1000).astype(int))]吗?
    • 嗯,那么最好将df1 中的列转换为ms 以获取匹配数据,然后使用df = pd.merge(df1, df, left_on='Time(s)', right_on='Time(msec)', how='right')
    • @Jezrael。 df2 具有 df1 的所有时间瞬间。所以'' df = df2[df2['Time(msec)'].isin(df1['Time(s)'].mul(1000))]'' 应该给出 df1 时刻的总数,但输出小于df1 号。经过一些迭代后,它从 59 跃升至 63,如图 5455 32945600 5457 32945800 5459 32946000 5463 32946400 所示。当两个数据框都具有此值时,它不会占用 3294200
    • 浮点数精度没有问题,所以不匹配?
    猜你喜欢
    • 2021-11-25
    • 2017-12-18
    • 2018-05-04
    • 2020-08-20
    • 1970-01-01
    • 1970-01-01
    • 2019-06-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多