繁体   English   中英

如何根据值之间的差异将值从一个 dataframe 列复制到另一列

[英]How can I copy values from one dataframe column to another based on the difference between the values

我有两个由两个不同服务器生成的 csv 镜像文件。 这两个文件具有相同的行数,并且应该具有完全相同的 unix 时间戳列。 但是,由于某些时钟问题,一个文件中的某些记录可能与另一个 csv 文件中的对应记录有一个纳秒的小差异,请参见下面的示例,差异始终为 1:

dataframe_A                                          dataframe_B

|          | ts_ns              |            |          | ts_ns              |
| -------- | ------------------ |            | -------- | ------------------ |
| 1        | 1661773636777407794|            | 1        | 1661773636777407793|
| 2        | 1661773636786474677|            | 2        | 1661773636786474677|
| 3        | 1661773636787956823|            | 3        | 1661773636787956823|
| 4        | 1661773636794333099|            | 4        | 1661773636794333100|

由于这些是具有数百万行的巨大文件,我使用 pandas 和 dask 来处理它们,但在处理之前,我需要确保它们具有相同的时间戳列。 我需要检查 A 和 B 中的 ts_ns 列之间的差异,如果存在 1 或 -1 的差异,我需要将 B 中的值替换为 A 中相应的 ts_ns 值,这样我最终可以在两者中拥有相同的 ts_ns 值相应记录的文件。

如何使用 pandas/dask 以体面的方式做到这一点?

如果您确定时间戳应该相同,为什么不简单地使用 dataframe A 中的时间戳列并用它覆盖 dataframe B 中的时间戳列?

为什么还要检查是否存在差异?

You can use the pandas merge_asof function for this, see https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.merge_asof.html . tolerance允许使用 int 或 timedelta ,对于您的示例,应将其设置为 +1, directionnearest

假设您的文件是相同的,除了您的ts_ns列,您可以对索引执行.merge

df_a = pd.DataFrame({'ts_ns': [1661773636777407794, 1661773636786474677, 1661773636787956823, 1661773636794333099]})
df_b = pd.DataFrame({'ts_ns': [1661773636777407793, 1661773636786474677, 1661773636787956823, 1661773636794333100]})

df_b = (df_b
    .merge(df_a, how='left', left_index=True, right_index=True, suffixes=('', '_a'))
    .assign(
        ts_ns = lambda df_: np.where(abs(df_.ts_ns - df_.ts_ns_a) <= 1, df_.ts_ns_a, df_.ts_ns)
    )
    .loc[:, ['ts_ns']]
)

但我同意@ManEngel,如果您知道它们相同,只需覆盖所有值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM