Dataframe 检查 2 列是否包含相同的元素
Dataframe check if 2 columns contain same elements
我有一个数据框,有 2 列 X 和 Y。
df = pd.DataFrame({
'X': ['a', 'a,b,c', 'a,d', 'e,f', 'a,c,d,f', 'e'],
'Y': ['a', 'a,c,b', 'd,a', 'e,g', 'a,d,f,g', 'e']
})
我想在数据框中创建一个新列('Match'),如果列 X 和 Y 具有相同的元素,则为 True,否则为 False。
df = pd.DataFrame({
'X': ['a', 'a,b,c', 'a,d', 'e,f', 'a,c,d,f', 'e'],
'Y': ['a', 'a,c,b', 'd,a', 'e,g', 'a,d,f,g', 'e'],
'Match':['True','True','True','False','False','True']
})
请帮我解决这个问题
这个有效:
df['Match']=df['X'].apply(set)==df['Y'].apply(set)
基本上,我在这里做的是将每一列的每个数据点转换成一个集合,然后比较它们。
它应该独立于 thata 的种类(例如数字或字符串)。
但是请注意,如果有重复,它不会区分。例如,如果您有 'a,c,c,b' 与 'a,c,b',那将产生 True。
您可以尝试拆分列以列出然后排序和比较。
df['Match2'] = df['X'].str.split(',').apply(sorted) == df['Y'].str.split(',').apply(sorted)
或者您可以将列表转换为设置和比较,具体取决于您是否想要复制
df['Match2'] = df['X'].str.split(',').apply(set) == df['Y'].str.split(',').apply(set)
print(df)
X Y Match Match2
0 a a True True
1 a,b,c a,c,b True True
2 a,d d,a True True
3 e,f e,g False False
4 a,c,d,f a,d,f,g False False
5 e e True True
为了避免重复,你可以这样做
df['Match'] = df[['X', 'Y']].apply(lambda col: col.str.split(',').apply(sorted)).eval('X == Y')
有很多方法可以做到这一点,一种方法是分解数组,对它们进行排序并匹配相等性。
import numpy as np
df1 = df.stack()\
.str.split(',')\
.explode()\
.sort_values()\
.groupby(level=[0,1])\
.agg(list).unstack(1)
df['match'] = np.where(df1['X'].eq(df1['Y']),True,False)
X Y match
0 a a True
1 a,b,c a,c,b True
2 a,d d,a True
3 e,f e,g False
4 a,c,d,f a,d,f,g False
5 e e True
我有一个数据框,有 2 列 X 和 Y。
df = pd.DataFrame({
'X': ['a', 'a,b,c', 'a,d', 'e,f', 'a,c,d,f', 'e'],
'Y': ['a', 'a,c,b', 'd,a', 'e,g', 'a,d,f,g', 'e']
})
我想在数据框中创建一个新列('Match'),如果列 X 和 Y 具有相同的元素,则为 True,否则为 False。
df = pd.DataFrame({
'X': ['a', 'a,b,c', 'a,d', 'e,f', 'a,c,d,f', 'e'],
'Y': ['a', 'a,c,b', 'd,a', 'e,g', 'a,d,f,g', 'e'],
'Match':['True','True','True','False','False','True']
})
请帮我解决这个问题
这个有效:
df['Match']=df['X'].apply(set)==df['Y'].apply(set)
基本上,我在这里做的是将每一列的每个数据点转换成一个集合,然后比较它们。
它应该独立于 thata 的种类(例如数字或字符串)。
但是请注意,如果有重复,它不会区分。例如,如果您有 'a,c,c,b' 与 'a,c,b',那将产生 True。
您可以尝试拆分列以列出然后排序和比较。
df['Match2'] = df['X'].str.split(',').apply(sorted) == df['Y'].str.split(',').apply(sorted)
或者您可以将列表转换为设置和比较,具体取决于您是否想要复制
df['Match2'] = df['X'].str.split(',').apply(set) == df['Y'].str.split(',').apply(set)
print(df)
X Y Match Match2
0 a a True True
1 a,b,c a,c,b True True
2 a,d d,a True True
3 e,f e,g False False
4 a,c,d,f a,d,f,g False False
5 e e True True
为了避免重复,你可以这样做
df['Match'] = df[['X', 'Y']].apply(lambda col: col.str.split(',').apply(sorted)).eval('X == Y')
有很多方法可以做到这一点,一种方法是分解数组,对它们进行排序并匹配相等性。
import numpy as np
df1 = df.stack()\
.str.split(',')\
.explode()\
.sort_values()\
.groupby(level=[0,1])\
.agg(list).unstack(1)
df['match'] = np.where(df1['X'].eq(df1['Y']),True,False)
X Y match
0 a a True
1 a,b,c a,c,b True
2 a,d d,a True
3 e,f e,g False
4 a,c,d,f a,d,f,g False
5 e e True