Python:当组标签和单个单元位于原始数据的同一列中时,为它们创建单独的列
我是Python新手,我怀疑以前可能有人问过这个问题,但我确实找不到任何相关的线程。因此,这是一个问题 我打算创建一个数据框架,其中包含“组标签”和“单个单元”的单独列,但原始数据的结构如下:Python:当组标签和单个单元位于原始数据的同一列中时,为它们创建单独的列,python,pandas,indexing,grouping,multi-level,Python,Pandas,Indexing,Grouping,Multi Level,我是Python新手,我怀疑以前可能有人问过这个问题,但我确实找不到任何相关的线程。因此,这是一个问题 我打算创建一个数据框架,其中包含“组标签”和“单个单元”的单独列,但原始数据的结构如下: import pandas as pd df = pd.read_table('df.txt', names = 'data') 上面写着 data 0 group1 1 unit_a 2 unit_b 3 group2 4 unit_c 5 unit_d 6 unit_e 7 gro
import pandas as pd
df = pd.read_table('df.txt', names = 'data')
上面写着
data
0 group1
1 unit_a
2 unit_b
3 group2
4 unit_c
5 unit_d
6 unit_e
7 group3
8 unit_f
9 unit_g
...
但我想创建一个这样的数据帧
Group Unit
0 group1 unit_a
1 group1 unit_b
2 group2 unit_c
3 group2 unit_d
4 group2 unit_e
5 group3 unit_f
6 group3 unit_g
...
也就是说,在原始数据中,单位列在各自的组标签下,并且都列在同一列中,而每个组可能包含不同数量的单位。因此,我很难使用时间间隔或其他方法对数据进行切片。如何将原始数据排序或切片为所需的两列数据帧类型输出
提前感谢。最基本的方法是使用
str.contains
,用屏蔽值分配一个新列,过滤列匹配的行(例如group1,group1
),然后重置索引
df = (df.assign(group=df[df.data.str.contains('group')])
.ffill()
.query('data != group')
.reset_index(drop=True)
.rename(columns={'data':'unit'}))
我忍不住觉得有一个更简单的方法来解决这个问题
演示
>>>> (df.assign(group=df[df.data.str.contains('group')])
.ffill()
.query('data != group')
.reset_index(drop=True))
.rename(columns={'data':'unit'}))
unit group
0 unit_a group1
1 unit_b group1
2 unit_c group2
3 unit_d group2
4 unit_e group2
5 unit_f group3
6 unit_g group3
这些字符串实际上是名为
group1
和unit\u a
的字符串,还是您在这里使用占位符来表示一些实际数据?谢谢提醒!它们是字符串(组名、个人名)。感谢您的回复。我添加了方括号来子集原始数据框,该数据框给出了几个唯一的组名。mask=df[df['data'].str.contains(“group”)]但对于以df[mask]开始的第二步,由于mask和df是不同长度的数据帧,因此建议的方法将不起作用。我将继续研究您提供的代码。我在另一个论坛上看到,建议使用部分字符串匹配,但我目前无法做到这一点。更新:抱歉,我没有看到你的更新代码。我将尝试实现它。我陷入了困境。query('data!=group')Python返回一条错误消息,其中缺少“data”的定义。.query('data!=group')中的“data”是等同于df['a']或df的数据帧吗?谢谢你。它是示例数据框中标记为data
的列。它可以工作!可以肯定的是,代码没有问题。我对“DataFrame.query()”中的字符串问题理解缓慢,这是罪魁祸首。也就是说,您的代码(和这个线程)提高了我对这个问题的理解。非常感谢。稍后我会发布我修改过的代码。