pandas 根据不是常量的第三列的值将值从一列复制到另一列

Pandas copy value from one column to another based on a value third column that is not constant( pandas 根据不是常量的第三列的值将值从一列复制到另一列)
本文介绍了 pandas 根据不是常量的第三列的值将值从一列复制到另一列的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

我的目标是将这些标题拉出到一个新列中,这样我就可以根据该列进行筛选以获得我想要的数据(一次一个标题)。我为此创建了一个空标题列。在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

经过多次搜索,我想不出如何进行这样的条件编辑。如果您能提供帮助,我们将不胜感激。

推荐答案

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

  1. 使用shiftisnanotna检查此条件。
  2. mask满足此条件时,HEADER列为NAME
  3. ffill(正向填充)新的HEADER
  4. dropna基于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

这篇关于 pandas 根据不是常量的第三列的值将值从一列复制到另一列的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

Leetcode 234: Palindrome LinkedList(Leetcode 234:回文链接列表)
How do I read an Excel file directly from Dropbox#39;s API using pandas.read_excel()?(如何使用PANDAS.READ_EXCEL()直接从Dropbox的API读取Excel文件?)
subprocess.Popen tries to write to nonexistent pipe(子进程。打开尝试写入不存在的管道)
I want to realize Popen-code from Windows to Linux:(我想实现从Windows到Linux的POpen-code:)
Reading stdout from a subprocess in real time(实时读取子进程中的标准输出)
How to call type safely on a random file in Python?(如何在Python中安全地调用随机文件上的类型?)