簡體   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