使用 Python 输出重复值 ID 和非重复值的列表
Output a list of duplicate values ID's and non duplicate values using Python
我在 csv 文件中保存了一个巨大的数据集,该文件包含 excel 数据中的 2 列,我需要打印出其中的行 ID 具有相同的 结果(无论数字的顺序如何)和另一个不相同的 结果列表。有些单元格中有超过 2 个整数。我正在尝试使用 Python 来执行此操作,我也四处阅读,熊猫似乎是前进的方向。请注意,我是 Python 的新手,似乎找不到一个简单的脚本来执行此操作(只有删除重复项的脚本)。
所以例如所需的输出会给我
Duplicated Row ID's: 1, 3
.
Unique Row ID's: 2, 4
.
A B C
ID Col1 Col2
-----------------------------
1 ["1", "3"] ["3", "1"]
2 ["1", "2"] ["9", "2"]
3 ["8", "0"] ["0", "8"]
4 ["3", "7"] ["1", "3"]
如有必要,首先将字符串 repr 转换为列表:
import ast
df['ColA'] = df['ColA'].apply(ast.literal_eval)
df['ColB'] = df['ColB'].apply(ast.literal_eval)
然后对两个列列表进行排序并按 Series.eq
, last filter by DataFrame.loc
with boolean indexing
进行比较,~
用于反转掩码:
m = df['ColA'].apply(sorted).eq(df['ColB'].apply(sorted))
dup = df.loc[m, 'ID']
print (dup)
0 1
2 3
Name: ID, dtype: int64
un = df.loc[~m, 'ID']
print (un)
1 2
3 4
Name: ID, dtype: int64
为了提高性能,可以将列表转换为 DataFrame 并进行比较,只需要两列和所有行中的列表长度相同:
df1 = pd.DataFrame(np.sort(df['ColA'].tolist(), axis=1), index=df.index)
df2 = pd.DataFrame(np.sort(df['ColB'].tolist(), axis=1), index=df.index)
print (df1)
0 1
0 1 3
1 1 2
2 0 8
3 3 7
m = df1.eq(df2).all(axis=1)
print (m)
0 True
1 False
2 True
3 False
dtype: bool
我在 csv 文件中保存了一个巨大的数据集,该文件包含 excel 数据中的 2 列,我需要打印出其中的行 ID 具有相同的 结果(无论数字的顺序如何)和另一个不相同的 结果列表。有些单元格中有超过 2 个整数。我正在尝试使用 Python 来执行此操作,我也四处阅读,熊猫似乎是前进的方向。请注意,我是 Python 的新手,似乎找不到一个简单的脚本来执行此操作(只有删除重复项的脚本)。
所以例如所需的输出会给我
Duplicated Row ID's: 1, 3
.
Unique Row ID's: 2, 4
.
A B C
ID Col1 Col2
-----------------------------
1 ["1", "3"] ["3", "1"]
2 ["1", "2"] ["9", "2"]
3 ["8", "0"] ["0", "8"]
4 ["3", "7"] ["1", "3"]
如有必要,首先将字符串 repr 转换为列表:
import ast
df['ColA'] = df['ColA'].apply(ast.literal_eval)
df['ColB'] = df['ColB'].apply(ast.literal_eval)
然后对两个列列表进行排序并按 Series.eq
, last filter by DataFrame.loc
with boolean indexing
进行比较,~
用于反转掩码:
m = df['ColA'].apply(sorted).eq(df['ColB'].apply(sorted))
dup = df.loc[m, 'ID']
print (dup)
0 1
2 3
Name: ID, dtype: int64
un = df.loc[~m, 'ID']
print (un)
1 2
3 4
Name: ID, dtype: int64
为了提高性能,可以将列表转换为 DataFrame 并进行比较,只需要两列和所有行中的列表长度相同:
df1 = pd.DataFrame(np.sort(df['ColA'].tolist(), axis=1), index=df.index)
df2 = pd.DataFrame(np.sort(df['ColB'].tolist(), axis=1), index=df.index)
print (df1)
0 1
0 1 3
1 1 2
2 0 8
3 3 7
m = df1.eq(df2).all(axis=1)
print (m)
0 True
1 False
2 True
3 False
dtype: bool