问题描述
我将很快按 3 列合并两个数据集。 希望原始数据集中没有/很少有 3 个列组重复。我想制作一些东西,大致说明每一行的独特性。可能是某种频率图(可能不起作用,因为我有一个非常大的数据集),可能是一个显示每 50 万行的平均频率的表格或类似的东西。
有没有办法确定每一行与其他行相比的唯一性?
1 2 3
A 100 B
A 200 B
A 200 B
对于上面的数据框,我想说每一行都是唯一的
1 2 3
A 200 B
A 200 B
A 100 B
对于这个数据集,第 1 行和第 2 行不是唯一的。我不想删除一个,但我希望量化/加权非唯一行的数量。
问题是我的数据框有 14,000,000 行长,所以我需要想一种方法来显示每行在如此大的集合中的独特性。
解决方法
假设您使用的是熊猫,这是一种可能的方法:
import pandas as pd
# Setup,which you can probably skip since you already have the data.
cols = ["1","2","3"]
rows = [
["A",200,"B",],["A",100,]
df1 = pd.DataFrame(rows,columns=cols)
# Get focus column values before adding a new column.
key_columns = df1.columns.values.tolist()
# Add a line column
df1["line"] = 1
# Set new column to cumulative sum of line values.
df1["match_count"] = df1.groupby(key_columns )['line'].apply(lambda x: x.cumsum())
# Drop line column.
df1.drop("line",axis=1,inplace=True)
打印结果
打印(df1)
输出 -
1 2 3 match_count
0 A 200 B 1
1 A 200 B 2
2 A 100 B 1
只返回唯一的行:
# We only want results where the count is less than 2,# because we have our key columns saved,we can just return those
# and not worry about 'match_count'
df_unique = df1.loc[df1["match_count"] < 2,key_columns]
print(df_unique)
输出 -
1 2 3
0 A 200 B
2 A 100 B