![](/img/trans.png)
[英]Copy contents from one Dataframe to another based on column values in Pandas
[英]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, direction
為nearest
。
假設您的文件是相同的,除了您的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.