Python 重塑dataframe:从列到行
我有一个给定[n,m]的数据帧df_,我想在每3行将列值更改为行值Python 重塑dataframe:从列到行,python,pandas,dataframe,reshape,Python,Pandas,Dataframe,Reshape,我有一个给定[n,m]的数据帧df_,我想在每3行将列值更改为行值 import pandas as pd df_test1 = pd.DataFrame({'A1': np.arange(1,4), 'B1': np.arange(10, 13), 'C1': np.arange(20, 23)}) df_test2 = pd.DataFrame({'A1': np.arange(11,14), 'B1': np.arange(100, 103), 'C1': np.arange(200, 2
import pandas as pd
df_test1 = pd.DataFrame({'A1': np.arange(1,4), 'B1': np.arange(10, 13), 'C1': np.arange(20, 23)})
df_test2 = pd.DataFrame({'A1': np.arange(11,14), 'B1': np.arange(100, 103), 'C1': np.arange(200, 203)})
df_given = pd.concat((df_test1, df_test2), axis =0)
df_desired = pd.DataFrame({'A': [1,10,20,11, 100, 200], 'B':[2,11, 21,12, 101, 201], 'C':[3,12,22,13, 102, 202]})
df_desired.head(10)
df_given.head(10)
IIUC
IIUC
将
pd.concat
与GroupBy
一起使用:
df = df.reset_index(drop=True)
res = pd.concat((pd.DataFrame(df_slice.T.values, columns=df.columns.str[0]) \
for _, df_slice in df.groupby(df.index // 3)), ignore_index=True)
print(res)
A B C
0 1 2 3
1 10 11 12
2 20 21 22
3 11 12 13
4 100 101 102
5 200 201 202
解释
将数据帧索引重置为常规索引,即df.reset_index(drop=True)
0,1,2,…,n
将数据帧分为3行。我们在生成器中迭代这个df.groupby(df.index//3)
对象GroupBy
将构成切片的3行转置,并转换为NumPy数组。我们将其馈送到df_slice.T.values
以从NumPy数组构造数据帧pd.DataFrame
获取一组数据帧,并将它们组合成一个数据帧pd.concat
pd.concat
和GroupBy
:
df = df.reset_index(drop=True)
res = pd.concat((pd.DataFrame(df_slice.T.values, columns=df.columns.str[0]) \
for _, df_slice in df.groupby(df.index // 3)), ignore_index=True)
print(res)
A B C
0 1 2 3
1 10 11 12
2 20 21 22
3 11 12 13
4 100 101 102
5 200 201 202
解释
将数据帧索引重置为常规索引,即df.reset_index(drop=True)
0,1,2,…,n
将数据帧分为3行。我们在生成器中迭代这个df.groupby(df.index//3)
对象GroupBy
将构成切片的3行转置,并转换为NumPy数组。我们将其馈送到df_slice.T.values
以从NumPy数组构造数据帧pd.DataFrame
获取一组数据帧,并将它们组合成一个数据帧pd.concat
groupby
,stack
和unstack
df1 = df_given.assign(g=df_given.groupby(level=0).cumcount()).set_index('g',append=True)
df1 = df1.stack().unstack(0).reset_index(drop=True)
df1.columns = df_given.columns
print (df1)
A1 B1 C1
0 1 2 3
1 10 11 12
2 20 21 22
3 11 12 13
4 100 101 102
5 200 201 202
使用
groupby
,stack
和unstack
df1 = df_given.assign(g=df_given.groupby(level=0).cumcount()).set_index('g',append=True)
df1 = df1.stack().unstack(0).reset_index(drop=True)
df1.columns = df_given.columns
print (df1)
A1 B1 C1
0 1 2 3
1 10 11 12
2 20 21 22
3 11 12 13
4 100 101 102
5 200 201 202
请粘贴的输入和输出的代码格式,而不是图像。我张贴了整个代码从一开始。我应该删除图片吗?代码很好,用正确的格式替换图片。好的,我不明白你的确切意思。我将不得不检查常见问题,因为我不知道什么是正确的图像格式。请粘贴的输入和输出的代码格式,而不是图像。我张贴了整个代码从一开始。我应该删除图片吗?代码很好,用正确的格式替换图片。好的,我不明白你的确切意思。我将不得不检查常见问题,因为我不知道什么是正确的图像格式。似乎没有更好的方法:-(@Silvia,当然,添加了一个解释。似乎没有更好的方法:-(@Silvia,当然,添加了一个解释。我是熊猫0.23.0,不幸的是,这对我不起作用。df被转换,但我仍然得到了一个(3,5)自卫队shape@Silvia这是工作,您只是忘记了将其赋回df=pd.concat([x代表uu,x在df_给定的.groupby((df_给定的.index==0.cumsum()),axis=1).你说得很对。我错了。对不起,我已经接受了另一个答案,我只能给你a+。我是熊猫0.23.0,不幸的是这对我不起作用。df被转换了,但我仍然得到一个(3,5)sdfshape@Silvia这是工作,您只是忘记了将其分配回df=pd.concat([x代表uuu,x代表df_u给定的.groupby((df_given.index==0.cumsum())],axis=1)你说得很对。我错了。对不起,我已经接受了另一个答案,我只能给你一个+。