【问题标题】:reshape dataframe: columns to lines重塑数据框:列到行
【发布时间】:2018-10-22 14:19:55
【问题描述】:

我有一个数据框 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)

【问题讨论】:

  • 请以代码格式粘贴输入输出,而不是图片。
  • 我从一开始就发布了整个代码。我应该删除图片吗?
  • 代码没问题,只要用正确的格式替换你的图片。
  • 好吧,我不明白你到底是什么意思。我将不得不检查常见问题解答问题,因为我不知道图像的正确格式是什么。

标签: python pandas dataframe reshape


【解决方案1】:

pd.concatGroupBy 一起使用:

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 接受一个可迭代的数据帧并将它们组合成一个数据帧。

【讨论】:

  • 似乎没有更好的办法:-(
  • @Silvia,当然,添加了解释。
【解决方案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

【讨论】:

  • 我是 pandas 0.23.0,不幸的是这对我不起作用。 df 已转置,但我仍然是 (3,5) sdf 形状
  • @Silvia 它是工作,你只是忘记将它分配回 df=pd.concat([x for _,x in df_given.groupby((df_given.index==0).cumsum()) ],axis=1).T
  • 你说的很对。我的错。对不起,我已经接受了另一个答案,我只能给你一个+。
【解决方案3】:

使用groupbystackunstack 的另一种选择

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-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-14
    • 2016-12-05
    • 2012-07-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多