将宽变长,但重复特定列

2024-04-20

我有一个数据框,如下所示

df2 = pd.DataFrame({'pid':[1,2,3,4],'BP1Date':['12/11/2016','12/21/2016','12/31/2026',np.nan],'BP1di':[21,24,25,np.nan],'BP1sy':[123,125,127,np.nan],'BP2Date':['12/31/2016','12/31/2016','12/31/2016','12/31/2016'],'BP2di':[21,26,28,30],'BP2sy':[123,130,135,145],
                   'BP3Date':['12/31/2017','12/31/2018','12/31/2019','12/31/2116'],'BP3di':[21,31,36,np.nan],'BP3sy':[123,126,145,np.nan]})

看起来如下图所示

我希望我的输出如下所示

这是我根据其他帖子的建议尝试的,但我无法产生或接近预期的输出

df = pd.melt(df2, id_vars='pid', var_name='col', value_name='dates')
df['col2'] = [x.split("Date")[0][:3] for x in df['col']]
df = df[df.groupby(['pid','col2'])['dates'].transform('count').ne(0)].copy()
df['col3'] = df['col2'].str.extract('(\d+)', expand=True).astype(int)
df2 = df.sort_values(by=['pid','col3'])

请注意两点

a) 对于每个日期,我有两个读数 (BP{n}di, BP{n}si)

b) 我只想在 NA 为 NA 时才删除 NA 记录all 3 columns一起(在本例中,对于 pid = 4,BP1Date、BP1di、BP1sy 为 NA)。如果任何列不是 NA,则应保留 NA,如下所示。因此我没有使用 stack(dropna=False) 而是使用基于 SO 帖子的 pd.melt

如何转换输入以获得如上屏幕截图所示的输出?

根据回答评论更新了屏幕截图


Use lreshape with DataFrame.stack http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.stack.html进行重塑,然后通过以下方式删除缺失值Date列依据DataFrame.dropna http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.dropna.html并按前 3 列排序:

a = [col for col in df2.columns if col.endswith('Date')]
b = [col for col in df2.columns if col.endswith('di')]
c = [col for col in df2.columns if col.endswith('sy')]

df1 = (pd.lreshape(df2, {'Date':a, 'di':b, 'sy':c}, dropna=False)
       .set_index(['pid','Date'])
       .stack(dropna=False)
       .rename_axis(['pid','Date','type'])
       .reset_index(name='value')
       .dropna(subset=['Date'])
       .assign(Date = lambda x: pd.to_datetime(x['Date'], dayfirst=True))
       .sort_values(['pid','Date','type'])
       .reset_index(drop=True)
       )

print (df1)
    pid       Date type  value
0     1 2016-11-12   di   21.0
1     1 2016-11-12   sy  123.0
2     1 2016-12-31   di   21.0
3     1 2016-12-31   sy  123.0
4     1 2017-12-31   di   21.0
5     1 2017-12-31   sy  123.0
6     2 2016-12-21   di   24.0
7     2 2016-12-21   sy  125.0
8     2 2016-12-31   di   26.0
9     2 2016-12-31   sy  130.0
10    2 2018-12-31   di   31.0
11    2 2018-12-31   sy  126.0
12    3 2016-12-31   di   28.0
13    3 2016-12-31   sy  135.0
14    3 2019-12-31   di   36.0
15    3 2019-12-31   sy  145.0
16    3 2026-12-31   di   25.0
17    3 2026-12-31   sy  127.0
18    4 2016-12-31   di   30.0
19    4 2016-12-31   sy  145.0
20    4 2116-12-31   di    NaN
21    4 2116-12-31   sy    NaN

替代解决方案是MultiIndex在创建的列中Series.str.extract http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.str.extract.html and MultiIndex.from_tuples http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.MultiIndex.from_tuples.html:

df2 = df2.set_index('pid')

c = df2.columns.to_frame(name='orig')
c = c['orig'].str.extract('(.+)(Date|di|sy)').apply(tuple, 1)

df2.columns = pd.MultiIndex.from_tuples(c)

df1 = (df2.stack(0)
       .set_index(['Date'], append=True)
       .reset_index(level=1, drop=True)
       .stack(dropna=False)
       .rename_axis(['pid','Date','type'])
       .reset_index(name='value')
       .dropna(subset=['Date'])
       .assign(Date = lambda x: pd.to_datetime(x['Date'], dayfirst=True))
       .sort_values(['pid','Date','type'])
       .reset_index(drop=True)
       )

print (df1)
    pid       Date type  value
0     1 2016-11-12   di   21.0
1     1 2016-11-12   sy  123.0
2     1 2016-12-31   di   21.0
3     1 2016-12-31   sy  123.0
4     1 2017-12-31   di   21.0
5     1 2017-12-31   sy  123.0
6     2 2016-12-21   di   24.0
7     2 2016-12-21   sy  125.0
8     2 2016-12-31   di   26.0
9     2 2016-12-31   sy  130.0
10    2 2018-12-31   di   31.0
11    2 2018-12-31   sy  126.0
12    3 2016-12-31   di   28.0
13    3 2016-12-31   sy  135.0
14    3 2019-12-31   di   36.0
15    3 2019-12-31   sy  145.0
16    3 2026-12-31   di   25.0
17    3 2026-12-31   sy  127.0
18    4 2016-12-31   di   30.0
19    4 2016-12-31   sy  145.0
20    4 2116-12-31   di    NaN
21    4 2116-12-31   sy    NaN
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将宽变长,但重复特定列 的相关文章

  • 如何将条目中的部分文本加粗并更改其背景颜色?

    我正在创建一个基于 Tkinter 的 GUI 它有一个 Entry 小部件 我想将其文本的一部分加粗并更改其背景颜色 但我不知道我该怎么做 如果我使用文本小部件 我可以只使用标签 但看起来它们不能与条目小部件一起使用 此代码使用文本小部件
  • Python:当前目录是否自动包含在路径中?

    Python 3 4 通过阅读其他一些 SO 问题 似乎如果moduleName py文件位于当前目录之外 如果要导入它 必须将其添加到路径中sys path insert 0 path to application app folder
  • python ttk treeview:如何选择并设置焦点在一行上?

    我有一个 ttk Treeview 小部件 其中包含一些数据行 如何设置焦点并选择 突出显示 指定项目 tree focus set 什么也没做 tree selection set 0 抱怨 尽管小部件明显填充了超过零个项目 但未找到项目
  • python中函数变量的作用域

    假设我们有两个函数 def ftpConnect ftp FTP server ftp login ftp cwd path def getFileList ftpConnect files ftp nlst print files 如果我
  • R:使用数据框 A 中某个日期之前的值填充数据框 B 中的行

    这可能非常复杂 我怀疑需要先进的知识 我现在有两种不同类型的 data frames 我需要组合 数据 数据框A 按患者 ID 列出所有输血日期 每次输血均由单独的行表示 患者可以进行多次输血 不同的患者可以在同一天进行输血 Patient
  • Python unicode 字符代码?

    有没有办法将 Unicode 字符 插入 Python 3 中的字符串 例如 gt gt gt import unicode gt gt gt string This is a full block s unicode charcode U
  • 我可以使用 dask 创建 multivariate_normal 矩阵吗?

    有点相关这个帖子 https stackoverflow com questions 52337612 random multivariate normal on a dask array 我正在尝试复制multivariate norma
  • 在 Mac 上安装 Pygame 到 Enthought 构建中

    关于在 Mac 上安装 Pygame 有许多未解答的问题 但我将在这里提出我的具体问题并希望得到答案 我在 Mac 上安装 Pygame 时遇到了难以置信的困难 我使用 Enthought 版本 EPD 7 3 2 32 位 它是我的默认框
  • 字典中列表中仅有的几个索引的总和

    如果我有这种类型的字典 a dictionary dog white 3 5 black 6 7 Brown 23 1 cat gray 5 6 brown 4 9 bird blue 3 5 green 1 2 yellow 4 9 mo
  • 使用循环将对象添加到列表(python)

    我正在尝试使用 while 循环将对象添加到列表中 基本上这就是我想做的 class x pass choice raw input pick what you want to do while choice 0 if choice 1 E
  • 在 Windows 上使用 IPython 笔记本时出现 500 服务器错误

    我刚刚在 Windows 7 Professional 64 位上全新安装了 IPython 笔记本 我采取的步骤是 从以下位置安装 Python 3 4 1http python org http python org gt pip in
  • 负整数的Python表示

    gt gt gt x 4 gt gt gt print b format x x 4 100 gt gt gt mask 0xFFFFFFFF gt gt gt print b format x mask x mask 4294967292
  • 使用 lambda 函数更改属性值

    我可以使用 lambda 函数循环遍历类对象列表并更改属性值 对于所有对象或满足特定条件的对象 吗 class Student object def init self name age self name name self age ag
  • 使用 Doc2vec 后如何解释 Clusters 结果?

    我正在使用 doc2vec 将关注者的前 100 条推文转换为矢量表示形式 例如 v1 v100 之后 我使用向量表示来进行 K 均值聚类 model Doc2Vec documents t size 100 alpha 035 windo
  • Python模块单元测试的最佳文件结构组织?

    遗憾的是 我发现有太多方法可以在 Python 中保存单元测试 而且它们通常没有很好的文档记录 我正在寻找一种 终极 结构 它可以满足以下大部分要求 be discoverable by test frameworks including
  • asyncio - 多次等待协程(周期性任务)

    我正在尝试为异步事件循环创建定期任务 如下所示 但是我收到 RuntimeError 无法重用已等待的协程 异常 显然 asyncio 不允许等待相同的可等待函数 如中讨论的这个错误线程 https bugs python org issu
  • PyQt 中的线程和信号问题

    我在 PyQt 中的线程之间进行通信时遇到一些问题 我使用信号在两个线程 发送者和监听者 之间进行通信 发送者发送消息 期望被监听者接收 但是 没有收到任何消息 谁能建议可能出了什么问题 我确信这一定很简单 但我已经环顾了几个小时但没有发现
  • 将此 MATLAB 代码转换为 Python 时我做错了什么?

    我正在努力将生成波形的 MATLAB 代码转换为 Python 就上下文而言 这是原子力显微镜带激发响应的模拟 与代码错误无关 在 MATLAB 中从 r vec 生成的图形与我在 Python 中生成的图形不同 我是否正确地将 MATLA
  • 如何识别图形线条

    我有以下格式的路径的 x y 数据 示例仅用于说明 seq p1 p2 0 20 2 3 1 20 2 4 2 20 4 4 3 22 5 5 4 22 5 6 5 23 6 2 6 23 6 3 7 23 6 4 每条路径都有多个点 它们
  • 使用 numpy 加速 for 循环

    下一个 for 循环如何使用 numpy 获得加速 我想这里可以使用一些奇特的索引技巧 但我不知道是哪一个 这里可以使用 einsum 吗 a 0 for i in range len b a numpy mean C d e f b i

随机推荐

  • Java 9 HttpClient 挂起

    我正在尝试HTTP 2客户来自jdk 9 ea 171 代码取自这个例子 https labs consol de development 2017 03 14 getting started with java9 httpclient h
  • PySide.QtGui RuntimeError:对象基类的“__init__”方法未调用...但它是

    一些环境基础知识 Python版本 3 4 2 操作系统 Windows 8 1 到目前为止的搜索 我怀疑这另一个问题 https stackoverflow com questions 12280371 python runtimeerr
  • 使用 R 计算边际税率

    我正在编写一个函数来根据给定的收入水平计算所欠税款澳大利亚的边际税率 https www ato gov au rates individual income tax rates 我编写了该函数的一个简单版本 该函数使用以下代码得出正确的应
  • 如何在保存之前对 Emacs 中更改的行执行操作?

    我想添加一个 before save hook 我可以在其中仅对自上次保存以来更改的行执行一些操作 例如 删除尾随空格 检查缩进等 我不想对整个文件执行此操作 并且我知道每个选项都有单独的选项 只是为了删除所有更改行的尾随空格 等等 但我想
  • 如何使用 Apache PDFBox 将 .png 图像添加到 pdf

    当我尝试使用 pdfBox 绘制 png 图像时 页面保持空白 有没有办法使用pdfBox插入png图像 public void createPDFFromImage String inputFile String image String
  • 如何从复合泛型类型中检索值?

    如何从泛型中检索值 具体来说 我正在尝试以下操作 Test let result Validate goodInput How to access record let request getRequest result 这是代码 type
  • 长文本微调器无法正常工作

    我的旋转器有一些问题 根据我的日期 我必须添加到TableRow a TextView与EditText or a Spinner 我必须在 Spinner 中显示的数组有点长 我用带有短文本的数组测试了我的代码 它看起来像这样 这里唯一的
  • Rails - 具有空数组的强参数

    我正在发送一组关联 ID 例如foo ids到我的控制器 为了允许值数组 我使用 params permit foo ids 现在的问题是 如果我发送一个空数组foo ids 该参数被忽略 而不是清除所有foos正如空数组应该做的那样 关联
  • 如何在响应拦截器中再次发送请求?

    我在我的应用程序中创建了一个拦截器来检测会话丢失 服务器发送 HTTP 419 在这种情况下 我需要从服务器请求一个新会话 然后我想自动再次发送原始请求 也许我可以将请求保存在请求拦截器中 然后再次发送 但可能有更简单的解决方案 请注意 我
  • Android 新的 CallLog.Calls.NUMBER_PRESENTATION 字段有什么用?

    我注意到 API 级别 19 Kitkat 中添加了一个名为 CallLog Calls NUMBER PRESENTATION 的新字段 The 文档 http developer android com reference androi
  • 在Java中,是否可以执行一个方法一段时间,并在达到时间限制后停止?

    我有下载网页的代码 HttpURLConnection connection private String downloadContent InputStream content Source parser try content conn
  • 在 MVC 框架中将 noSQL 和 ORM 结合起来用于实际案例应用程序

    一段时间以来 我一直在尝试将过去几年中读到的一些有关 noSQL couchDB mongoDB Redis 的 酷 东西投入实际使用 我非常习惯使用 Django 编写应用程序 并开始使用 Play 当 Java 是唯一可接受的部署选项
  • 如何以编程方式获取 vmmap 中显示的信息?

    任何看过 Mark Russovich 演讲 揭示内存管理之谜 的人都知道 vmmap 工具可以向您显示与进程限制 普通 32 位 Windows 上为 2GB 相关的内容 而其他工具似乎很少了解这些内容 我希望能够以编程方式监控我的rea
  • WPF 无法从 MouseDown 事件获取触摸位置

    我有一个 WPF 项目是在 NET v 4 0 添加触摸支持之前编写的 因此仅处理鼠标事件 我在用手指在触摸屏上测试项目时遇到了这个问题 问题是 位置 X Y 在第一次触摸中被正确检索 但 X Y 值在后续触摸中保持不变 无论我触摸哪里 即
  • 无效的 PHP JSON 编码

    我正在 PHP 5 3 1 中的一个项目中工作 我需要将 JSON 字符串发送到 web 服务 在 python 中 但是从 json encode 获得的结果不会作为有效的 JSON 传递 我正在使用 JSLint检查有效性 我应该补充一
  • 在 Windows powershell 中使用 svn 缺少参数 -m

    我正在尝试在 Windows PowerShell 上运行它 svn ci m directory name 但它返回 svn E205005 日志消息是一个路径名 F 是故意的吗 使用 force log 覆盖 我尝试 cd 该目录并在没
  • Django持久数据库连接

    我将 django 与 apache mod wsgi 和 PostgreSQL 都在同一主机上 一起使用 并且我需要处理大量简单的动态页面请求 每秒数百个 我面临的问题是 瓶颈是 django 没有持久的数据库连接 并且在每个请求上重新连
  • lapply 和 mutate_all/for 循环

    我在列表中有几个数据框 我必须通过标准化所有列中的所有数据来修改这些数据框 基本上 将每行 列除以该列数的总和 使用 lapply 加载所有原始数据帧后 我想迭代所有列以执行此类操作 即 mutate df df my column df
  • 如何正确解析这种日期?

    我无法为我的日期找到正确且干净的工作解决方案 其格式如下 201406082159 6月8日 21 59 此处 我上次尝试的是这样的 SimpleDateFormat format2 new SimpleDateFormat YYYYMMD
  • 将宽变长,但重复特定列

    我有一个数据框 如下所示 df2 pd DataFrame pid 1 2 3 4 BP1Date 12 11 2016 12 21 2016 12 31 2026 np nan BP1di 21 24 25 np nan BP1sy 12