Pandas 熊猫计数相同/不同的列
我的数据集如下所示:Pandas 熊猫计数相同/不同的列,pandas,count,Pandas,Count,我的数据集如下所示: Id City Color City_1 Color_1 123 Miami Nan Miami Nan 124 Miami nan Nan Miami 125 Seattle Nan Mexico Nan 126 Nan white Nan Yellow 127 Wash
Id City Color City_1 Color_1
123 Miami Nan Miami Nan
124 Miami nan Nan Miami
125 Seattle Nan Mexico Nan
126 Nan white Nan Yellow
127 Wash Nan Wash Nan
128 LA pink LA Pink
(重新创建):
我必须比较列,忽略NaN并向数据集中添加相同/不同的列,然后需要输出相同和不同的计数
输出数据集应如下所示
Id City Color City_1 Color_1 Result
123 Miami Nan Miami Nan Same
124 Miami nan Nan Miami Different
125 Seattle Nan Mexico Nan Different
126 Nan white Nan Yellow Different
127 Wash Nan Wash Nan Same
128 LA pink LA Pink Same
不知道如何比较,忽略NAN,首先将缺少的值重新计算为相同的值,例如,
缺少
,然后比较小写值-如果只有两列可以使用:
或者,如果有多个列,如City、City\u 1、City\u 2、City\u N
使用通用解决方案:
f = lambda x: x.str.lower()
df11 = df.filter(like='City').apply(f).fillna('missing')
df22 = df.filter(like='Color').apply(f).fillna('missing')
m1 = df11.eq(df11.iloc[:, 0], axis=0).all(axis=1)
m2 = df22.eq(df22.iloc[:, 0], axis=0).all(axis=1)
df['Result'] = np.where(m1 & m2, 'Same','Different')
print (df)
Id City Color City_1 Color_1 Result
0 123 Miami NaN Miami NaN Same
1 124 Miami NaN NaN Miami Different
2 125 Seattle NaN Mexico NaN Different
3 126 NaN white NaN Yellow Different
4 127 Wash NaN Wash NaN Same
5 128 LA pink LA Pink Same
首先将缺少的值重新拼合为相同的值,例如
缺少
,然后比较小写值-如果只有两列可以与以下内容一起使用:
或者,如果有多个列,如City、City\u 1、City\u 2、City\u N
使用通用解决方案:
f = lambda x: x.str.lower()
df11 = df.filter(like='City').apply(f).fillna('missing')
df22 = df.filter(like='Color').apply(f).fillna('missing')
m1 = df11.eq(df11.iloc[:, 0], axis=0).all(axis=1)
m2 = df22.eq(df22.iloc[:, 0], axis=0).all(axis=1)
df['Result'] = np.where(m1 & m2, 'Same','Different')
print (df)
Id City Color City_1 Color_1 Result
0 123 Miami NaN Miami NaN Same
1 124 Miami NaN NaN Miami Different
2 125 Seattle NaN Mexico NaN Different
3 126 NaN white NaN Yellow Different
4 127 Wash NaN Wash NaN Same
5 128 LA pink LA Pink Same
nan有一些令人惊讶的属性,例如
bool(np.nan==np.nan)=False
——这可能就是您遇到的问题
如果希望它们的计算结果相等,可以将它们转换为字符串,也可以使用fillna
并在所有地方填充相同的值。由于另一个响应涵盖了fillna
路径,因此我将在这里转换为string:
df["Result"] = ((df.City.astype(str) == df.City_1.astype(str)) & (df.Color.astype(str).str.lower() == df.Color_1.astype(str).str.lower())).map({True:"Same", False:"Different"})
结果:
Id City Color City_1 Color_1 Result
0 123 Miami Nan Miami NaN Same
1 124 Miami NaN NaN Miami Different
2 125 Seattle NaN Mexico NaN Different
3 126 NaN white NaN Yellow Different
4 127 Wash NaN Wash NaN Same
5 128 LA pink LA Pink Same
现有列上的任何操作都不会发生,也不会被修改;仅创建
结果
。请注意,我使用了Pink.lower()==Pink
来重现您的预期结果。nan有一些令人惊讶的属性,例如bool(np.nan==np.nan)=False
-这可能是您遇到的问题
如果希望它们的计算结果相等,可以将它们转换为字符串,也可以使用fillna
并在所有地方填充相同的值。由于另一个响应涵盖了fillna
路径,因此我将在这里转换为string:
df["Result"] = ((df.City.astype(str) == df.City_1.astype(str)) & (df.Color.astype(str).str.lower() == df.Color_1.astype(str).str.lower())).map({True:"Same", False:"Different"})
结果:
Id City Color City_1 Color_1 Result
0 123 Miami Nan Miami NaN Same
1 124 Miami NaN NaN Miami Different
2 125 Seattle NaN Mexico NaN Different
3 126 NaN white NaN Yellow Different
4 127 Wash NaN Wash NaN Same
5 128 LA pink LA Pink Same
现有列上的任何操作都不会发生,也不会被修改;仅创建
结果
。注意:我使用了Pink.lower()==Pink
来重现您的预期结果。如果您将df.的输出发布到dict()
,我们可以重新创建您的数据以直接进行测试。我错过了nan
问题,因为它们是从上面转换为字符串复制/粘贴的。如果您将df的输出发布到_dict()
,我们可以直接重新创建数据进行测试。我错过了nan
问题,因为它们是从上面复制/粘贴字符串的