我有一個df包含 4 列x、y、z、 和的 xyz 點的資料框,,, 和Classification,都包含浮點數。資料幀是通過連接另外兩個資料幀df1和df2.
中的所有點df2都是中的點的子集df1,但是這兩個資料幀在不同的軟體中進行了不同的處理。中的所有點df2的分類為 14。中的所有點df1都不屬于 14 類。因此,在 df 中,有些點本質上是xyz 重復項(這些 xyz 重復項的數量是len(df2)),其中一半是 14 類。我想要找到這些重復項并丟棄那些不是第 14 類的。
我說這些行本質上是xyz 重復項,因為在之前的處理程序中,許多行都引入了浮點錯誤。
>>> # make example data,
>>> # small differences introduced on 2nd data
>>> x1 = np.array([0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0])
>>> x2 = x1[:4] np.array([0, 0, 3e-13, 0])
>>> y1 = np.array([10.0, 11.01, 12.0, 13.0, 14.0, 15.0, 16.0])
>>> y2 = y1[:4] np.array([0, 0, 3e-13, 4e-13])
>>> z1 = np.array([10.0, 10.1, 10.2, 10.3, 10.4, 10.5, 10.6])
>>> z2 = z1[:4] np.array([0.0, 0.0, 3e-13, 4e-13])
>>> df1 = pd.DataFrame(columns=['x', 'y', 'z', 'Classification'])
>>> df1['x'] = x1
>>> df1['y'] = y1
>>> df1['z'] = z1
>>> df1['Classifcation'] = 0
>>> df2 = pd.DataFrame(columns=['x', 'y', 'z', 'Classification'])
>>> df2['x'] = x2
>>> df2['y'] = y2
>>> df2['z'] = z2
>>> df2['Classifcation'] = 14
>>> df1
x y z Classification
0 0.0 10.00 10.0 0
1 1.0 11.01 10.1 0
2 2.0 12.00 10.2 0
3 3.0 13.00 10.3 0
4 4.0 14.00 10.4 0
5 5.0 15.00 10.5 0
6 6.0 16.00 10.6 0
>>> df2
x y z Classification
0 0.0 0.0 3.000000e-13 14
1 1.0 1.0 1.000000e 00 14
2 2.0 2.0 2.000000e 00 14
3 3.0 3.0 3.000000e 00 14
>>> df = pd.concat ([df1, df2], axis=0)
>>> df
x y z Classification
0 0.0 10.00 1.000000e 01 0
1 1.0 11.01 1.010000e 01 0
2 2.0 12.00 1.020000e 01 0
3 3.0 13.00 1.030000e 01 0
4 4.0 14.00 1.040000e 01 0
5 5.0 15.00 1.050000e 01 0
6 6.0 16.00 1.060000e 01 0
0 0.0 0.00 3.000000e-13 14
1 1.0 1.00 1.000000e 00 14
2 2.0 2.00 2.000000e 00 14
3 3.0 3.00 3.000000e 00 14
本來我試過
>>> df0 = df.loc[~((df.duplicated(subset=['x', 'y', 'z'],
keep=False))
& (df.Classification != 14))]
>>> df0
x y z Classification
2 2.0 12.00 10.2 0
3 3.0 13.00 10.3 0
4 4.0 14.00 10.4 0
5 5.0 15.00 10.5 0
6 6.0 16.00 10.6 0
0 0.0 10.00 10.0 14
1 1.0 11.01 10.1 14
2 2.0 12.00 10.2 14
3 3.0 13.00 10.3 14
>>> len(df), len(df0)
(11, 9)
這丟棄了所有非 14 分類的精確重復項,但錯過了由浮點錯誤創建的接近(在 x、y 和 z 中)重復項。
我需要做一些類似df.duplicated但行為的事情,numpy.isclose以便在一定容差范圍內的值將被視為重復。
謝謝
uj5u.com熱心網友回復:
一種方法是在 concat 之前洗掉重復項,據我所知,您正在嘗試洗掉 df1 中已經存在于 df2 中的行。這里的技巧是使用 isin 并創建一個可以輕松比較兩個資料幀的鍵,您可以使用字串格式并設定小數點(下面的示例使用 5 個點)。
df_1['key'] = df_1.apply(lambda row: f'{row["X"]:.5f}-{row["Y"]:.5f}-{row["Z"]:.5f}', axis=1)
df_2['key'] = df_2.apply(lambda row: f'{row["X"]:.5f}-{row["Y"]:.5f}-{row["Z"]:.5f}', axis=1)
df_1 = df_1[df_1['key'].isin(df_2['key'])==False]
combined = pd.concat([df_1, df_2])
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/392023.html
上一篇:Pandas-從包含字典串列的列中的df中的字典中提取值
下一篇:如何根據列值過濾資料框
