繁体   English   中英

Python pandas:在没有for循环的情况下检查行值是否在同一列的另一行中

[英]Python pandas: check if a rows value is in another row of the same column without a for loop

我正在处理一个包含分配有数值的字符串的数据框。 对于每个字符串,我想检查它是否作为另一个字符串中的子字符串出现。 如果是,那么我想在新列中为其分配两个数值中较低的一个。 如果没有,我想将其现有值分配给新列。

数据框看起来像这样:

RCS_D        | RCS_enc
-------------------------
GRANITE      | 1
CHALK        | 2
GRANITE      | 1
SCHIST       | 3 
MICROGRANITE | 4
SCHIST       | 3
METACHALK    | 5

我正在寻找的示例输出是这样的:

RCS_D        | RCS_enc | RCS_min
--------------------------------
GRANITE      | 1       | 1
CHALK        | 2       | 2
GRANITE      | 1       | 1
SCHIST       | 3       | 3
MICROGRANITE | 4       | 1
SCHIST       | 3       | 3
METACHALK    | 5       | 2

我的问题是是否有一种方法可以在不使用循环的情况下快速在 Pandas 中执行此操作? 如果不是,最快的方法是什么? 谢谢!

有两个问题需要解决。 首先是发现RCS_D列中所有单词之间的关系。

此函数采用pandas.Series并返回具有正确映射的副本

def map_to_substrings(series):
    series = series.copy()
    for value in series.unique():
        series[series.str.contains(value)] = value
    return series   

mapped_RCS_D = map_to_substrings(df["RCS_D"])

mapped_RCS_D看起来像这样

0    GRANITE
1      CHALK
2    GRANITE
3     SCHIST
4    GRANITE
5     SCHIST
6      CHALK
dtype: object

然后我们可以对这个系列进行RCS_enc ,找到RCS_enc列中的最小值,然后使用它来映射这些值。

df["RCS_min"] = mapped_RCS_D.map(df.groupby(mapped_RCS_D)["RCS_enc"].min())

暂无
暂无

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

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