gpt4 book ai didi

python - 在 Pandas 中合并无列

转载 作者:行者123 更新时间:2023-11-28 19:17:37 26 4
gpt4 key购买 nike

我有两个带有时间戳数据的数据帧。我想选择两个数据帧的时间戳差小于某个阈值的所有值。

例如,数据帧 1 和 2 看起来像这样,除了不同的、不可预测的时钟值:

   clock      head        px        py        pz        qw         
0 0.000000 -0.316579 0.119198 0.149585 0.271688 0.987492 -0.002514
1 0.200000 -0.316642 0.119212 0.149593 0.271678 0.987487 -0.002522
2 1.200000 -0.316546 0.119199 0.149585 0.271669 0.987495 -0.002507


clock head px py pz qw
0 0.010000 -0.316579 0.119198 0.149585 0.271688 0.987492 -0.002514
1 1.1040000 -0.316642 0.119212 0.149593 0.271678 0.987487 -0.002522
2 2.4030000 -0.316546 0.119199 0.149585 0.271669 0.987495 -0.002507

生成的数据框看起来像是假设阈值为 0.1:

   clock      head1        head2        px1        px2        ...         
0 0.000000 -0.316579 -0.316579 0.119198 0.119198 ...
1 1.200000 -0.316546 -0.316642 0.119199 0.119212 ...

我目前的方法是:在两个数据框中创建一个相同的“填充”列,在此列上合并(创建一个 len(dataframe1)*len(dataframe2) 长度数据框),然后过滤我想要的列:

#rename the dataframe keys so that they are different
dataframe1.columns = [i+str(1) for i in dataframe1.columns.values]
dataframe1['filler'] = 0
dataframe2.columns = [i+str(2) for i in dataframe2.columns.values]
dataframe2['filler'] = 0
# merge requires a column to merge on, so merge on the filler
df_merged = dataframe1.merge(dataframe2,on='filler',how='left')
#pick out only the rows with the time differences within the threshold
mask = (df_merged[keyword+str(1)]<= df_merged[keyword+str(2)]+threshold) & (df_merged[keyword+str(1)]> df_merged[keyword+str(2)]-threshold)
df_merged = df_merged[mask]
#delete the filler column
del df_merged['filler']
#reindex the dataframe
df_merged.index = arange(0, len(df_merged))

这非常快,可以提供我想要的输出,但是,创建一个我必须删除的“填充”列感觉很愚蠢。我想知道是否有我错过的更明显的解决方案。

在“关键字”列上合并并没有给我想要的结果,这只会在时间完全相同的情况下生成具有完整数据的数据帧,而没有时差阈值。

最佳答案

您可以使用 np.where 更改您的 df2clock 列数据以匹配 df1' s 如果它在模糊匹配的阈值内。

import pandas as pd
import numpy as np

# THE TEST DATA YOU GAVE US -------------------------
columns = ['clock', 'head', 'px', 'py', 'pz', 'qw']

series1 = [(0.0, 0.1, 0.5),
(-0.316579, -0.316642, -0.316546),
(0.119198, 0.119212, 0.119199),
(0.149585, 0.149593, 0.149585),
(0.271688, 0.271678, 0.271669),
(0.987492, 0.987487, 0.987495),
(-0.002514, -0.002522, -0.002507)]

series2 = [(0.01, 0.104, 0.403),
(-0.316579, -0.316642, -0.316546),
(0.119198, 0.119212, 0.119199),
(0.149585, 0.149593, 0.149585),
(0.271688, 0.271678, 0.271669),
(0.987492, 0.987487, 0.987495),
(-0.002514, -0.002522, -0.002507)]
# THE TEST DATA YOU GAVE US -------------------------

df1 = pd.DataFrame(dict(zip(columns, series1)))
df2 = pd.DataFrame(dict(zip(columns, series2)))

threshold = 0.99

df2['clock'] = np.where(
abs(df1['clock'] - df2['clock']) < threshold, df1['clock'], df2['clock'])

merged_df = df1.merge(df2, on='clock', how='outer')
print(merged_df)

clock head_x px_x py_x pz_x qw_x head_y px_y py_y pz_y qw_y
0 0.0 -0.316579 0.119198 0.149585 0.271688 0.987492 -0.316579 0 0.119198 0.149585 0.271688 0.987492
1 0.1 -0.316642 0.119212 0.149593 0.271678 0.987487 -0.316642 1 0.119212 0.149593 0.271678 0.987487
2 0.5 -0.316546 0.119199 0.149585 0.271669 0.987495 -0.316546 2 0.119199 0.149585 0.271669 0.987495

这样做的好处是不会合并任何与阈值不匹配的行,因此如果您的 DataFrames 也有 df1['clock'] == 6df2['clock'] == 7(在 0.99 阈值之外),你最终会得到另外两行,其中一行 clock == 6 和所有充满 NaN_y,还有一个 clock == 7 和所有 _x 充满 NaN

关于python - 在 Pandas 中合并无列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31614119/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com