首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用pd.wide_to_long并使用sep= be括号,只获取带有列名的空数据

使用pd.wide_to_long并使用sep= be括号,只获取带有列名的空数据
EN

Stack Overflow用户
提问于 2022-11-03 20:56:43
回答 2查看 27关注 0票数 0

我正在尝试做pd.wide_to_long,我想根据括号中的内容进行分离。我查阅了熊猫手册这里,下面是关闭示例。我更改了列名,使其与我所拥有的内容相匹配。

代码语言:javascript
复制
np.random.seed(0)
df = pd.DataFrame({'A(weekly_2010)': np.random.rand(3),
                   'A(weekly_2011)': np.random.rand(3),
                   'B(weekly_2010)': np.random.rand(3),
                   'B(weekly_2011)': np.random.rand(3),
                   'X' : np.random.randint(3, size=3)})
df['id'] = df.index

我会做

代码语言:javascript
复制
df1=pd.wide_to_long(df, stubnames=['A', 'B'], i=['id'], j='year', sep='()', suffix='\w+')

这将返回一个空数据。我查看了这个示例并切换了I和J,但是它返回了一个KeyError:“[索引(‘None’,dtype='object')]中没有一个在列中”,我尝试了下面的sep=,但仍然没有成功。有人知道如何获得以下数据吗?

代码语言:javascript
复制
df1=pd.wide_to_long(df, stubnames=['A', 'B'], i=['id'], j='year', sep='(*)', suffix='\w+')
df1=pd.wide_to_long(df, stubnames=['A', 'B'], i=['id'], j='year', sep='\\()', suffix='\w+')
df1=pd.wide_to_long(df, stubnames=['A', 'B'], i=['id'], j='year', sep=r'\\()', suffix='\w+')
df1=pd.wide_to_long(df11, stubnames=['A', 'B'], i=['id'], j='year', sep=r'\(*\)', suffix='\w+')

想要的数据将是

代码语言:javascript
复制
desiredDF= pd.DataFrame({'year':["(weekly_2010)","(weekly_2010)","(weekly_2010)","(weekly_2011)","(weekly_2011)","(weekly_2011)"],
               'A': np.random.rand(6),
               'B': np.random.rand(6),
               'X' : np.random.randint(6, size=6),
               'id':np.random.randint(6, size=6)})

很明显,用同样的数字,我只想显示重要的列,哪一列是年份列。我需要做枢轴,因为我的数据更复杂,而且做其他格式,搞砸了数字。如果有人知道如何在九月写,我会非常感激!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-11-03 21:35:13

试一试,移除尾随的结束括号,并在开括号上分隔:

代码语言:javascript
复制
df.columns = df.columns.str.replace(')','', regex=False)
pd.wide_to_long(df, stubnames=['A', 'B'], i=['id'], j='year', sep='(', suffix='\w+')

输出:

代码语言:javascript
复制
                X         A         B
id year                              
0  weekly_2010  0  0.548814  0.437587
1  weekly_2010  1  0.715189  0.891773
2  weekly_2010  1  0.602763  0.963663
0  weekly_2011  0  0.544883  0.383442
1  weekly_2011  1  0.423655  0.791725
2  weekly_2011  1  0.645894  0.528895

我发现,有时您需要做一些准备工作,以使pd.wide_to_long正常工作。

票数 1
EN

Stack Overflow用户

发布于 2022-11-03 22:01:20

@ScottBoston的解决方案运行良好。我建议一种替代pd.wide_to_long的方法,它提供更多的灵活性,同时仍然具有表演性--来自化脓者更长

代码语言:javascript
复制
# pip install pyjanitor
import pandas as pd
import janitor

df.pivot_longer(index=['X', 'id'], 
                names_to = ('.value', 'year'), 
                names_pattern=r"(.)(.+)") 
   X  id           year         A         B
0  0   0  (weekly_2010)  0.548814  0.437587
1  1   1  (weekly_2010)  0.715189  0.891773
2  1   2  (weekly_2010)  0.602763  0.963663
3  0   0  (weekly_2011)  0.544883  0.383442
4  1   1  (weekly_2011)  0.423655  0.791725
5  1   2  (weekly_2011)  0.645894  0.528895

本例中的.value告诉函数将列的这一部分保留为标题。这是由传递给names_patternnames_sep的参数决定的。

坚持使用pd.wide_to_long,只需对suffix参数使用泛型.+正则表达式:

代码语言:javascript
复制
pd.wide_to_long(df, 
                stubnames = ['A','B'], 
                i = 'id', 
                j = 'year', 
                sep='', 
                suffix='.+') 
                  X         A         B
id year                                
0  (weekly_2010)  0  0.548814  0.437587
1  (weekly_2010)  1  0.715189  0.891773
2  (weekly_2010)  1  0.602763  0.963663
0  (weekly_2011)  0  0.544883  0.383442
1  (weekly_2011)  1  0.423655  0.791725
2  (weekly_2011)  1  0.645894  0.528895
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74309458

复制
相关文章

相似问题

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