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
问题,因为它们是从上面复制/粘贴字符串的