Pandas 根据非恒定值的第三列将值从一列复制到另一列

Posted

技术标签:

【中文标题】Pandas 根据非恒定值的第三列将值从一列复制到另一列【英文标题】:Pandas copy value from one column to another based on a value third column that is not constant 【发布时间】:2022-01-10 08:05:42 【问题描述】:

我有一个大型数据集,它是一个巨大的表,实际上应该是许多表。标题隐藏在子集的行中。

我的目标是将这些标题拉到一个新列中,以便我可以按该列过滤以获得我想要的数据(一次一个标题)。我为此创建了一个空的标题列。 SCORE 列中始终存在一系列 3 个 NaN 值,其中该系列中 NAME 列中的第一个值是我想要的 HEADER。所以我在考虑可以利用这种关系。

当前的 Pandas 数据框具有以下结构:

s = '''HEADER,NAME,SCORE
NaN,Header 1,NaN
NaN,Random Junk,NaN
NaN,Random Junk,NaN
NaN,Ed,98
NaN,Gary,78
NaN,Floyd,89
NaN,Header 2,NaN
NaN,Random Junk,NaN
NaN,Random Junk,NaN
NaN,Mary,96
NaN,Steve,78'''

import pandas as pd
from io import StringIO

df = pd.read_csv(StringIO(s))
HEADER   NAME              SCORE
NaN      Header 1          NaN
NaN      Random Junk       NaN
NaN      Random Junk       NaN
NaN      Ed                98
NaN      Gary              78
NaN      Floyd             89
...      ...               ...
NaN      Header 2          NaN
NaN      Random Junk       NaN
NaN      Random Junk       NaN
NaN      Mary              96
NaN      Steve             78

我想要这个:

HEADER        NAME              SCORE
Header 1      Header 1          NaN
Header 1      Random Junk       NaN
Header 1      Random Junk       NaN
Header 1      Ed                98
Header 1      Gary              78
Header 1      Floyd             89
...           ...               ...
Header 2      Header 2          NaN
Header 2      Random Junk       NaN
Header 2      Random Junk       NaN
Header 2      Mary              96
Header 2      Steve             78

这样我就可以删除 NaN 行并获得我真正想要的内容:

HEADER        NAME              SCORE
Header 1      Ed                98
Header 1      Gary              78
Header 1      Floyd             89
...           ...               ...
Header 2      Mary              96
Header 2      Steve             78

经过大量搜索,我无法弄清楚如何进行这种条件编辑。非常感谢您提供的任何帮助。

【问题讨论】:

您的实际数据是否包含 NaN?例如:98 nan 89? 是的,就像我在上面的数据框中写的那样。在源材料中没有任何内容(空值)。它是使用 read_html 从网站上抓取的,这是由此产生的数据框。 埃德·加里·弗洛伊德的身价可以是nan吗? 不,我已从该列中删除了所有 NaN 值。 【参考方案1】:

标题行出现在SCORE 依次具有 3 个 NaN 和 1 个非 NaN 时,因此:

    使用shiftisnanotna 检查这种情况。 满足此条件时,maskHEADER 列为 NAMEffill(前向填充)新的HEADERdropna 基于SCORE
is_header = df.SCORE.isna() & df.SCORE.shift(-1).isna() & df.SCORE.shift(-2).isna() & df.SCORE.shift(-3).notna()
df.HEADER = df.HEADER.mask(is_header, df.NAME).ffill()
df = df.dropna(subset=['SCORE'])

#       HEADER   NAME  SCORE
# 3   Header 1     Ed   98.0
# 4   Header 1   Gary   78.0
# 5   Header 1  Floyd   89.0
# 9   Header 2   Mary   96.0
# 10  Header 2  Steve   78.0

【讨论】:

我也在考虑类似的问题,但我怀疑如果原始数据有 nan 会发生什么。像 Ed 分数是 nan (+1)。 不错,值得一提

以上是关于Pandas 根据非恒定值的第三列将值从一列复制到另一列的主要内容,如果未能解决你的问题,请参考以下文章

如何将值从一列映射到另一列数据框? [复制]

有效地将值从一列替换到另一列 Pandas DataFrame

Liquibase:将值从一列复制到具有数组数据类型的另一列

如果满足条件,熊猫将值从一列复制到另一列

Postgres 创建触发器函数以在允许插入之前将值从一列复制到另一列

在同一个表中将值从一列复制到另一列