首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >熊猫:将组名移至新栏目

问熊猫:将组名移至新栏目
EN

Stack Overflow用户
提问于 2018-04-03 03:23:35
回答 3查看 62关注 0票数 2

环境- PY3.6,木星笔记本:

代码语言:javascript
复制
import pandas as pd
import os
from IPython.display import display, HTML

我有一个excel文件,我已经读到了一个数据文件。我在这里以编程方式重新创建了数据:

代码语言:javascript
复制
xl = [['group1'],
     ['john'],
     ['mike'],
     ['marry'],
     ['group2'],
     ['dan'],
     ['ann'],
     ['jacob'],
     ['susan']]

创建一个pd.DataFrame(),然后display它。

代码语言:javascript
复制
s = pd.DataFrame(xl)
display(s)

    0
0   group1
1   john
2   mike
3   marry
4   group2
5   dan
6   ann
7   jacob
8   susan

期望的输出是:

代码语言:javascript
复制
    0       1
0           group1
1   group1  john
2   group1  mike
3   group1  marry
4           group2
5   group2  dan
6   group2  ann
7   group2  jacob
8   group2  susan

我尝试过几种.melt()的变体,但只有当"group1“或"group2”是列索引时,才能使其工作。我还尝试过各种形式的.pivot()和.stack()。.stack函数似乎是最有希望的,但是它要求DataFrame像我希望的那样被多个索引化来工作。

我的具体问题是熊猫是否有功能做到这一点?

或

我是否需要使用组名称作为列标题将df分解为组件组-然后执行stack()或melt()类型函数?

编辑:我想我也可以迭代行-但这将是很棘手的,因为“组”并不总是已知的。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-04-03 04:06:54

IIUC str.contains + ffill

代码语言:javascript
复制
df['1']=df['0'][df['0'].str.contains('group')]
df['1'].ffill(inplace=True)
df
Out[11]: 
        0       1
0  group1  group1
1    john  group1
2    mike  group1
3   marry  group1
4  group2  group2
5     dan  group2
6     ann  group2
7   jacob  group2
8   susan  group2
票数 2
EN

Stack Overflow用户

发布于 2018-04-03 03:38:04

有一种方法--不能保证速度和优雅:

代码语言:javascript
复制
# Rename column to match desired output
df.columns = [1]

# Build a series with index=group_number, value=group_name
num2name = df[df[1].str.startswith('group')].reset_index(drop=True)

# Add column that indicates the group membership of each row, starting at 0
df[0] = df[1].str.startswith('group').cumsum() - 1

# Convert group numbers (0 onward) to group names ('groupN' starting from 1)
df[0].replace(group_rows, inplace=True)

df.sort_index(axis=1)
df
        0       1
0  group1  group1
1  group1    john
2  group1    mike
3  group1   marry
4  group2  group2
5  group2     dan
6  group2     ann
7  group2   jacob
8  group2   susan
票数 0
EN

Stack Overflow用户

发布于 2018-04-03 03:41:56

你可以试试:

代码语言:javascript
复制
# convert list to df
xl = pd.DataFrame(xl)

# extract words starting with group and fill the following blank values
xl['1'] = xl[0].str.findall('group.*').str[0].ffill()

# set value as NA where group is present in column 0
xl['1'] = xl.groupby('1')['1'].shift(1)

print(xl)

    0       1
0   group1  NaN
1   john    group1
2   mike    group1
3   marry   group1
4   group2  NaN
5   dan     group2
6   ann     group2
7   jacob   group2
8   susan   group2
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49621727

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档