Python 熊猫:检查是否至少有一个值重复';行数为1

Python 熊猫:检查是否至少有一个值重复';行数为1,python,pandas,Python,Pandas,这个问题可能相当具体,但我打赌很多人也会遇到这个问题。 因此,我有一个数据帧,其形式如下: asd = pd.DataFrame({'Col1': ['a', 'b', 'b','a','a'], 'Col2': [0,0,0,1,1]}) 生成的表如下所示: I -- Col1 -- Col2 1 -- a -- 0 2 -- b -- 0 3 -- b -- 0 4 -- a -- 1 5 -- a -- 1 I -- Col1 -- Col2 -- Col

这个问题可能相当具体,但我打赌很多人也会遇到这个问题。 因此,我有一个数据帧,其形式如下:

asd = pd.DataFrame({'Col1': ['a', 'b', 'b','a','a'], 'Col2': [0,0,0,1,1]})
生成的表如下所示:

I -- Col1 -- Col2
1 -- a    -- 0
2 -- b    -- 0
3 -- b    -- 0
4 -- a    -- 1
5 -- a    -- 1
I -- Col1 -- Col2 -- Col3
1 -- a    -- 0    -- 1     because "a" has value of 1 in 4th and 5th lines
2 -- b    -- 0    -- 0     because all "b" have values of 0
3 -- b    -- 0    -- 0
4 -- a    -- 1    -- 1
5 -- a    -- 1    -- 1
我想做的是:
如果
Col1
中至少有一个“a”值在
Col2
中具有相应的
1
值,那么在
Col3
中,我们将
1
用于所有“a”值
否则(如果没有一个“a”的值为1),那么我们将“a”的所有值都设为“0”
然后对
Col1
中的所有其他值重复此操作

操作的结果应如下所示:

I -- Col1 -- Col2
1 -- a    -- 0
2 -- b    -- 0
3 -- b    -- 0
4 -- a    -- 1
5 -- a    -- 1
I -- Col1 -- Col2 -- Col3
1 -- a    -- 0    -- 1     because "a" has value of 1 in 4th and 5th lines
2 -- b    -- 0    -- 0     because all "b" have values of 0
3 -- b    -- 0    -- 0
4 -- a    -- 1    -- 1
5 -- a    -- 1    -- 1
目前我正在这样做:

asd['Col3'] = 0
col1_uniques = asd.drop_duplicates(subset='Col1')['Col1']
small_dataframes = []

for i in col1_uniques:
    small_df = asd.loc[asd.Col1 == i]
    if small_df.Col2.max() == 1:
        small_df['Col3'] = 1

    small_dataframes.append(small_df)
然后我重新组装数据帧

但是,这需要太多的时间(我在Col1中有大约80000个惟一值)。事实上,当我写这篇文章的时候,它甚至还没有完成四分之一的工作


有更好的方法吗

您可以使用groupby和if语句来实现这一点。首先,按Col1对所有项目进行分组:

lists = asd.groupby("Col1").agg(lambda x: tuple(x))
这将为您提供:

           Col2
Col1           
a     (0, 1, 1)
b        (0, 0)
然后可以遍历列表中的唯一索引值,屏蔽原始数据帧,如果在列表[“Col2”]中找到1,则将Col3设置为1

这导致:

    Col1    Col2    Col3
0   a   0   1
1   b   0   0
2   b   0   0
3   a   1   1
4   a   1   1

我的理解是,您需要对Col1中的所有唯一值重复此过程,您需要groupby

asd['Col3'] = asd.groupby('Col1').Col2.transform(lambda x: x.eq(1).any().astype(int))

    Col1    Col2    Col3
0   a       0       1
1   b       0       0
2   b       0       0
3   a       1       1
4   a       1       1
选项2:与上述解决方案类似,但使用map

d = asd.groupby('Col1').Col2.apply(lambda x: x.eq(1).any().astype(int)).to_dict()
asd['Col3'] = asd['Col1'].map(d)

另一种方法没有
groupby
,使用和更快:


阿比的答案更好,而且可能更快。我也没有意识到你可以在Pandas中使用np.where。你可以在Pandas中使用所有的np函数,因为Pandas是建立在numpin之上的,如果你正在为数据帧编写循环,有一个更好的方法:)谢谢!“这两种方法分别在34秒和24秒内奏效和完成。”阿斯卡拉赫梅多夫,太好了。第二种解决方案的工作速度更快,因为它在Col1中每个唯一值只需进行一次分组。这是迄今为止最快的方法和最直观的方法。谢谢。