Pandas 根据第三列不是常量的值将值从一列复制到另一列
Pandas copy value from one column to another based on a value third column that is not constant
我有一个很大的数据集,它是一个巨大的 table,实际上应该有很多 table。 header 被埋在子集的行中。
我的目标是将那些 header 拉出到一个新列中,这样我就可以按该列进行筛选以获取我想要的数据(一次一个 header)。我为此创建了一个空的 header 列。 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
经过大量搜索,我无法弄清楚如何进行这样的条件编辑。如果您能提供任何帮助,我们将不胜感激。
当 SCORE
依次有 3 个 NaN 和 1 个 non-NaN 时,header 行出现,所以:
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
我有一个很大的数据集,它是一个巨大的 table,实际上应该有很多 table。 header 被埋在子集的行中。
我的目标是将那些 header 拉出到一个新列中,这样我就可以按该列进行筛选以获取我想要的数据(一次一个 header)。我为此创建了一个空的 header 列。 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
经过大量搜索,我无法弄清楚如何进行这样的条件编辑。如果您能提供任何帮助,我们将不胜感激。
当 SCORE
依次有 3 个 NaN 和 1 个 non-NaN 时,header 行出现,所以:
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