我有一个数据帧df_given [n,m],我想将每三行的列值更改为行值。
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)
答案 0 :(得分:2)
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
答案 1 :(得分:2)
将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
提取一个可迭代的数据帧,并将其组合以构造单个数据帧。
答案 2 :(得分:1)
使用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