为了账号安全,请及时绑定邮箱和手机立即绑定

重塑数据框:列到行

重塑数据框:列到行

慕盖茨4494581 2021-07-13 13:14:18
我有一个数据框 df_given [n, m] 并且我想将列值更改为每 3 行的行值。import pandas as pddf_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)
查看完整描述

3 回答

?
拉莫斯之舞

TA贡献1820条经验 获得超10个赞

使用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 获取可迭代的数据帧并将它们组合起来以构建单个数据帧。


查看完整回答
反对 回复 2021-07-27
?
HUX布斯

TA贡献1876条经验 获得超6个赞

使用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



查看完整回答
反对 回复 2021-07-27
  • 3 回答
  • 0 关注
  • 137 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号