我正在尝试做pd.wide_to_long,我想根据括号中的内容进行分离。我查阅了熊猫手册这里,下面是关闭示例。我更改了列名,使其与我所拥有的内容相匹配。
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我会做
df1=pd.wide_to_long(df, stubnames=['A', 'B'], i=['id'], j='year', sep='()', suffix='\w+')这将返回一个空数据。我查看了这个示例并切换了I和J,但是它返回了一个KeyError:“[索引(‘None’,dtype='object')]中没有一个在列中”,我尝试了下面的sep=,但仍然没有成功。有人知道如何获得以下数据吗?
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+')想要的数据将是
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)})很明显,用同样的数字,我只想显示重要的列,哪一列是年份列。我需要做枢轴,因为我的数据更复杂,而且做其他格式,搞砸了数字。如果有人知道如何在九月写,我会非常感激!
发布于 2022-11-03 21:35:13
试一试,移除尾随的结束括号,并在开括号上分隔:
df.columns = df.columns.str.replace(')','', regex=False)
pd.wide_to_long(df, stubnames=['A', 'B'], i=['id'], j='year', sep='(', suffix='\w+')输出:
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正常工作。
发布于 2022-11-03 22:01:20
@ScottBoston的解决方案运行良好。我建议一种替代pd.wide_to_long的方法,它提供更多的灵活性,同时仍然具有表演性--来自化脓者的更长
# 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_pattern或names_sep的参数决定的。
坚持使用pd.wide_to_long,只需对suffix参数使用泛型.+正则表达式:
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.528895https://stackoverflow.com/questions/74309458
复制相似问题