检查和删除 DataFrame 的一系列行中的重复邻居值
Checking and deleting duplicate neighbor values in a series of rows for a DataFrame
我在数据框中有一组行,这些行有一些重复的相邻值,这些值都位于每列的相同位置,看起来像这样:
row_data = pd.DataFrame({0 : [1.1, 1.2, 1.2, 1.3, 1.4, 1.5, 1.5, 1.6],
1 : [2.3, 2.2, 2.2, 2.3, 2.4, 2.5, 2.5, 2.6],
2 : [2.4, 2.2, 2.2, 2.3, 2.4, 2.6, 2.6, 2.7],
3 : [7.1, 7.2, 7.2, 7.3, 7.4, 7.5, 7.5, 7.6]}).T
如上所述,第 0 行中的 (1.2, 1.2) 与第 1 行中的 (2.2, 2.2)、第 2 行中的 (2.2, 2.2) 和第 3 行中的 (7.2, 7.2) 处于相同的位置等...
我希望能够首先检查每一行中是否有重复的邻居,删除重复的只留下它的第一个实例,并告诉我有多少 总共 重复被删除。
我已经尝试遍历每一行,但由于此数据框非常大(36 行乘以 260,000 列),因此耗时太多。我想要的伪代码将遵循以下逻辑:
count_dup = 0
for index in range(0, len(row_data.columns)):
if row_data[index] == row_data[index+1]:
count_dup = count_dup + 1
row_data[index] = np.nan
我的伪代码显然不起作用,但剩下的就是通过删除所有列中的重复项来删除 NAN。
输出将是:
row_data_dropped = pd.DataFrame({0 : [1.1, 1.2, 1.3, 1.4, 1.5, 1.6],
1 : [2.3, 2.2, 2.3, 2.4, 2.5, 2.6],
2 : [2.4, 2.2, 2.3, 2.4, 2.6, 2.7],
3 : [7.1, 7.2, 7.3, 7.4, 7.5, 7.6]}).T
total_dropped_neighbors = 8
有什么办法可以做到这一点吗?
IIUC,这是我会尝试的:
non_dups = row_data.ne(row_data.shift(1,axis=1)).any()
row_data.loc[:,non_dups]
输出:
0 1 3 4 5 7
0 1.1 1.2 1.3 1.4 1.5 1.6
1 2.3 2.2 2.3 2.4 2.5 2.6
2 2.4 2.2 2.3 2.4 2.6 2.7
3 7.1 7.2 7.3 7.4 7.5 7.6
我在数据框中有一组行,这些行有一些重复的相邻值,这些值都位于每列的相同位置,看起来像这样:
row_data = pd.DataFrame({0 : [1.1, 1.2, 1.2, 1.3, 1.4, 1.5, 1.5, 1.6],
1 : [2.3, 2.2, 2.2, 2.3, 2.4, 2.5, 2.5, 2.6],
2 : [2.4, 2.2, 2.2, 2.3, 2.4, 2.6, 2.6, 2.7],
3 : [7.1, 7.2, 7.2, 7.3, 7.4, 7.5, 7.5, 7.6]}).T
如上所述,第 0 行中的 (1.2, 1.2) 与第 1 行中的 (2.2, 2.2)、第 2 行中的 (2.2, 2.2) 和第 3 行中的 (7.2, 7.2) 处于相同的位置等...
我希望能够首先检查每一行中是否有重复的邻居,删除重复的只留下它的第一个实例,并告诉我有多少 总共 重复被删除。
我已经尝试遍历每一行,但由于此数据框非常大(36 行乘以 260,000 列),因此耗时太多。我想要的伪代码将遵循以下逻辑:
count_dup = 0
for index in range(0, len(row_data.columns)):
if row_data[index] == row_data[index+1]:
count_dup = count_dup + 1
row_data[index] = np.nan
我的伪代码显然不起作用,但剩下的就是通过删除所有列中的重复项来删除 NAN。
输出将是:
row_data_dropped = pd.DataFrame({0 : [1.1, 1.2, 1.3, 1.4, 1.5, 1.6],
1 : [2.3, 2.2, 2.3, 2.4, 2.5, 2.6],
2 : [2.4, 2.2, 2.3, 2.4, 2.6, 2.7],
3 : [7.1, 7.2, 7.3, 7.4, 7.5, 7.6]}).T
total_dropped_neighbors = 8
有什么办法可以做到这一点吗?
IIUC,这是我会尝试的:
non_dups = row_data.ne(row_data.shift(1,axis=1)).any()
row_data.loc[:,non_dups]
输出:
0 1 3 4 5 7
0 1.1 1.2 1.3 1.4 1.5 1.6
1 2.3 2.2 2.3 2.4 2.5 2.6
2 2.4 2.2 2.3 2.4 2.6 2.7
3 7.1 7.2 7.3 7.4 7.5 7.6