pandas 如何识别列中第二次出现的值,然后将同一行但不同列的值Map到其他值?

pxy2qtax  于 2023-01-28  发布在  其他
关注(0)|答案(2)|浏览(122)

我有一个正在使用的 Dataframe ,我想识别列中特定值的第二个示例,然后将同一行的不同列中的值Map到同一行。下面是一个最简单的示例:

col1     col2     
 'a'      's'
 'b'      's'
 'f'      's'
 'g'      's'
 'b'      's'
 'l'      's'

以上是我正在使用的 Dataframe 的一个简短示例,因此我想确定第二次出现的'b'以及col2'p'的行Map。
因此,输出将是:

col1     col2     
 'a'      's'
 'b'      's'
 'f'      's'
 'g'      's'
 'b'      'p'
 'l'      's'

我对 Dataframe 很陌生,所以恐怕没有现有的代码可以使用。我应该提到的是,这个 Dataframe 没有索引,所以不能使用iloc,否则它将是微不足道的。

mwngjboj

mwngjboj1#

使用带有两个掩码的布尔索引(等于"b"和(&duplicated以标识第二个"b"):

# is the row a "b"?
m1 = df['col1'].eq('b')

# is the value duplicated? (i.e. a second "b")
m2 = df['col1'].duplicated()

# if both match, then update
df.loc[m1&m2, 'col2'] = 'p'

输出:

col1 col2
0    a    s
1    b    s
2    f    s
3    g    s
4    b    p
5    l    s

中间体:

col1 col2     m1     m2  m1&m2
0    a    s  False  False  False
1    b    s   True  False  False
2    f    s  False  False  False
3    g    s  False  False  False
4    b    p   True   True   True
5    l    s  False  False  False
bfnvny8b

bfnvny8b2#

Series.duplicated&链接用于逐位AND,并将值与Series.eq进行比较,然后传递到DataFrame.loc-此处所有重复值(不含第一个值)均转换为p

df.loc[df['col1'].eq('b') & df['col1'].duplicated(), 'col2'] = 'p'

或者通过比较1(来自0的python计数)链接GroupBy.cumcount以比较第二个值:

m =  df['col1'].eq('b')
df.loc[m & df[m].groupby('col1').cumcount().eq(1), 'col2'] = 'p'

如果3个或更多值b,则解的差异为:

m =  df['col1'].eq('b')
df.loc[m & df[m].groupby('col1').cumcount().eq(1), 'col3'] = 'p'

df.loc[df['col1'].eq('b') & df['col1'].duplicated(), 'col4'] = 'p'

print (df)
  col1 col2 col3 col4
0    a    s  NaN  NaN
1    b    s  NaN  NaN
2    f    s  NaN  NaN
3    g    s  NaN  NaN
4    b    s    p    p
5    l    s  NaN  NaN
6    b    s  NaN    p

相关问题