重塑数据框:列到行
reshape dataframe: columns to lines
我有一个数据框 df_given [n, m],我想将每 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, 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
pd.concat([x for _,x in df_given.groupby((df_given.index==0).cumsum())],axis=1).T
Out[997]:
0 1 2
A1 1 2 3
B1 10 11 12
C1 20 21 22
A1 11 12 13
B1 100 101 102
C1 200 201 202
将 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)
将数据帧索引重置为常规 pd.RangeIndex
,即 0, 1, 2, ..., n
.
df.groupby(df.index // 3)
将数据帧分组为 3 行的块。我们在生成器理解中迭代这个 GroupBy
对象。
df_slice.T.values
转置构成切片的 3 行并转换为 NumPy 数组。我们将其提供给 pd.DataFrame
以从 NumPy 数组构建数据框。
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
我有一个数据框 df_given [n, m],我想将每 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, 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
pd.concat([x for _,x in df_given.groupby((df_given.index==0).cumsum())],axis=1).T
Out[997]:
0 1 2
A1 1 2 3
B1 10 11 12
C1 20 21 22
A1 11 12 13
B1 100 101 102
C1 200 201 202
将 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)
将数据帧索引重置为常规pd.RangeIndex
,即0, 1, 2, ..., n
.df.groupby(df.index // 3)
将数据帧分组为 3 行的块。我们在生成器理解中迭代这个GroupBy
对象。df_slice.T.values
转置构成切片的 3 行并转换为 NumPy 数组。我们将其提供给pd.DataFrame
以从 NumPy 数组构建数据框。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