Python重新创建数据帧
我有一个数据帧,如下所示:Python重新创建数据帧,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个数据帧,如下所示: df = yy mm col1 col2 2020 7 0.22 10 2020 7 0.50 30 2020 7 0.60 40 2020 7 0.50 70 2020 7 0.60 90 我想将数据帧分为3部分,并对其进行转置,使其结果如下: yy mm col1 col2 col1 col2 col1 col2 2020 7
df =
yy mm col1 col2
2020 7 0.22 10
2020 7 0.50 30
2020 7 0.60 40
2020 7 0.50 70
2020 7 0.60 90
我想将数据帧分为3部分,并对其进行转置,使其结果如下:
yy mm col1 col2 col1 col2 col1 col2
2020 7 0.22 10 0.60 40 0.60 90
2020 7 0.50 30 0.50 70 NaN NaN
到目前为止,我所做的是:
a = np.array_split(df,3)
a =
[ yy mm col1 col2
2020 7 0.22 10
2020 7 0.50 30,
yy mm col1 col2
2020 7 0.60 40,
2020 7 0.50 70
yy mm col1 col2
2020 7 0.60 90]
之后我将a中列表的每个元素转换为数据帧:a0=a[0],a1=a[1]和a2=a[2],然后执行pandas.concat([a0,a1,a2],axis=1,keys=['yy','mm'])。
然而,如果我有更大的数据帧df,并且我将它分成许多部分(而不是仅仅3部分),那么我的解决方案是很麻烦的。
谢谢。试试这个:
df=pd.DataFrame({'yy':[2020]*5,'mm':[7]*5,'col1':[0.22,0.5,0.6,0.5,0.6],'col2':[10,30,40,70,90]})
length=2
lis=[]
i=0
while i<(len(df)/length)+length:
lis.append(df.iloc[i:i+length,:].reset_index(drop=True))
i+=length
final=pd.concat(lis,axis=1)
试试这个:
df=pd.DataFrame({'yy':[2020]*5,'mm':[7]*5,'col1':[0.22,0.5,0.6,0.5,0.6],'col2':[10,30,40,70,90]})
length=2
lis=[]
i=0
while i<(len(df)/length)+length:
lis.append(df.iloc[i:i+length,:].reset_index(drop=True))
i+=length
final=pd.concat(lis,axis=1)
可能需要使用几个步骤
df1=df.set_index([df.index % 2, df.index // 2]).unstack().sort_index(level=1, axis=1,ascending=True)#Split dataframe on every 2nd row
df1.columns = df1.columns.droplevel(1)#drop multi level index
m=df1.loc[:,['mm','yy']]#Isolate columns with yy, mm
s=m.loc[:,~m.columns.duplicated()]#drop duplicates in isolated above
t=df1.filter(regex='^col', axis=1)#filter rows with col
res=pd.concat([s,t], axis=1)#Concat into new frame res
mm yy col1 col2 col1 col2 col1 col2
0 7.0 2020.0 0.22 10.0 0.6 40.0 0.6 90.0
1 7.0 2020.0 0.50 30.0 0.5 70.0 NaN NaN
可能需要使用几个步骤
df1=df.set_index([df.index % 2, df.index // 2]).unstack().sort_index(level=1, axis=1,ascending=True)#Split dataframe on every 2nd row
df1.columns = df1.columns.droplevel(1)#drop multi level index
m=df1.loc[:,['mm','yy']]#Isolate columns with yy, mm
s=m.loc[:,~m.columns.duplicated()]#drop duplicates in isolated above
t=df1.filter(regex='^col', axis=1)#filter rows with col
res=pd.concat([s,t], axis=1)#Concat into new frame res
mm yy col1 col2 col1 col2 col1 col2
0 7.0 2020.0 0.22 10.0 0.6 40.0 0.6 90.0
1 7.0 2020.0 0.50 30.0 0.5 70.0 NaN NaN
我认为你的代码是正确的,但是你觉得有什么棘手的地方吗?我实际上在寻找一种更有效的方法,以防我的数据帧更大,我需要将它分成许多部分(而不是仅仅3部分)。你不需要将它们保存到单独的变量中,你可以直接将它们合并:
a=np.array\u split(df,3)
然后pd.concat([i.reset_index(),用于a中的i],轴=1)
添加一个新列,以便通过旋转变换它如何df['flg']=[1,1,2,2,3,3,…]'
之后更新列名如何?我认为你的代码是正确的,但你觉得有什么棘手的地方?我实际上在寻找一种更有效的方法,以防我的数据帧更大,我需要将其分成许多部分(而不是仅仅3部分),而不是将它们保存到单个变量中,您可以直接将它们合并:a=np.array\u split(df,3)
然后pd.concat([i.reset\u index()for i in a],axis=1)
添加一个新列,以便通过旋转对其进行转换如何df['flg']=[1,1,2,2,3,3,…]'
之后更新列名如何?