繁体   English   中英

熊猫:检查重复项行中的至少一个值是否为1

Pandas: check whether at least one of values in duplicates' rows is 1

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

这个问题可能很具体,但是我敢打赌,很多人也会遇到这个问题。 所以我有一个像这样的形式的DataFrame:

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

我想做的是:
如果至少有一个在“a”值Col1具有的相应值1Col2 ,然后在Col3我们把1为“A”的所有值
否则(如果甚至没有一个“ a”的值为1),那么我们将“ a”的所有值都设为“ 0”
然后对Col1所有其他值重复上述操作。

操作结果应如下所示:

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个唯一值)。 实际上,在我撰写本文时,它甚至还没有完成那项工作的四分之一。

有更好的方法吗?

3 个回复

我的理解是,您需要对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:与上述类似的解决方案,但使用地图

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

没有另一种方法groupby和更快的使用np.whereisin

v = asd.loc[asd['Col2'].eq(1), 'Col1'].unique()
asd['Col3'] = np.where(asd['Col1'].isin(v), 1, 0)

print(asd)
  Col1  Col2  Col3
0    a     0     1
1    b     0     0
2    b     0     0
3    a     1     1
4    a     1     1

您可以使用groupby和if语句执行此操作。 首先按Col1将所有项目分组:

lists = asd.groupby("Col1").agg(lambda x: tuple(x))

这给您:

           Col2
Col1           
a     (0, 1, 1)
b        (0, 0)

然后,您可以遍历列表中的唯一索引值,屏蔽原始DataFrame,如果在list [“ Col2”]中找到1,则将Col3设置为1。

asd["Col3"] = 0
for i in lists.index:
    if 1 in lists.loc[i, "Col2"]:
        asd.loc[asd["Col1"]==i, "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
1 如果至少一个单元格是 NaN,则 Pandas 连接行

我有一个从 PDF 文件中提取的文本构建的 Pandas 数据框。 它看起来像这样: 总是至少有 1 行没有 NaN,该行将始终包含日期和值。 只有描述位于多行上。 有没有办法根据日期将行与下面的行连接起来,直到值不为 NaN,然后​​加入描述? 预期输出: ...

2 检查是否至少一列包含熊猫中的字符串

我想检查几列是否包含一个字符串,并用结果生成一个布尔列。 这对于单列很容易做到,但是当将此方法应用于多列时会生成属性错误( AttributeError: 'DataFrame' object has no attribute 'str' )。 例子: 返回: 以下代码在应用于单个列时有效 ...

3 单行检查迭代器是否至少产生一个元素?

目前我正在这样做: 但是我想要一个可以放在简单if语句中的表达式。 有什么内置的东西可以让这段代码看起来不那么笨拙吗? 如果可迭代对象为空,则any()返回False ,但如果不是,它可能会遍历所有项目。 我只需要它来检查第一项。 有人问我想做什么。 我编写了一个执行 SQL 查询并产生其 ...

6 Python Pandas:检查一列中的值是否存在于另一列中的行子集中

我有一个包含 3 列的数据框 df:“颜色”、“之前”、“之后”。 我需要检查“之后”列中的每个项目是否存在于每种颜色的“之前”列中。 如果在颜色子集中找到一个值,我希望创建一个带有 'True' 的新列 'is_present',否则创建一个 'False'。 对不起,如果不清楚,我添加了预期的 ...

8 检查是否至少一个列表包含特定元素

有人能告诉我写这个逻辑的最短方法是什么吗? 我有两个列表list_one和list_two包含一些字母。 如果这两个列表都不包含“B”,我需要打印(真)。 我编写的代码段有效,但我很想知道是否有一种 Pythonic 的方式来编写它,而不是在同一行中重复 'B' 两次。 提前致谢,任何帮助将不 ...

9 如何检查一个字符串是否至少包含一个字母字符?

我想检查一个字符串是否至少包含一个字母字符? 正则表达式可能像: 但是,我想判断一个字符串是否至少包含一个字母字符? 所以我想用 所以我对如何使用正则表达式不知所措 我试过了 并使用x =“ 1234”进行测试,以上两个脚本输出结果均为“ yes”,所以它们是错 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2021 STACKOOM.COM