pandas 如何获得由另一个 Dataframe 的部分转置片段构成的新df

5jdjgkvh  于 2022-12-16  发布在  其他
关注(0)|答案(3)|浏览(133)

我正在努力让我的 Dataframe 转置,不是简单的转置,但我想限制列数的行数在索引slices,为了很好地解释我的问题,我给予你我的 Dataframe 在这里:

df=pd.DataFrame({
        'n' : [0,1,2, 0,1,2, 0,1,2],
    'col1' : ['A', 'A', 'A', 'B', 'B', 'B', 'C', 'C', 'C'],
    'col2' : [9.6,10.4, 11.2, 3.3, 6, 4, 1.94, 15.44, 6.17]
    })

其显示如下:

n   col1    col2
0   0   A   9.60
1   1   A   10.40
2   2   A   11.20
3   0   B   3.30
4   1   B   6.00
5   2   B   4.00
6   0   C   1.94
7   1   C   15.44
8   2   C   6.17

从该 Dataframe 中,我希望获得以下new_df

0   1   2
col1    A   A   A
col2    9.6 10.4    11.2
col1    B   B   B
col2    3.3 6.0 4.0
col1    C   C   C
col2    1.94    15.44   6.17

目前为止我尝试的是:

new_df = df.values.reshape(3, 9)
new_w = [x.reshape(3,3).T for x in new_df]
df_1 = pd.DataFrame(new_w[0])
df_1.index = ['n', 'col1', 'col2']
df_2 = pd.DataFrame(new_w[1])
df_2.index = ['n', 'col1', 'col2']
df_3 = pd.DataFrame(new_w[2])
df_3.index = ['n', 'col1', 'col2']
new_df = df_1.append(df_2)
new_df = new_df.append(df_3)
new_df[new_df.index!='n']

我尝试的代码工作,但它看起来很长,我想要另一个较短的解决方案。
如果您能提供任何帮助,我们将不胜感激,谢谢。

93ze6v8z

93ze6v8z1#

factorize标识“col1”中的唯一值,然后用melt合并两列,再用pivot标识:

(df.assign(idx=pd.factorize(df['col1'])[0]).melt(['n', 'idx'])
   .pivot(index=['idx', 'variable'], columns='n', values='value')
   .droplevel('idx').rename_axis(index=None, columns=None) # optional
)

或者使用groupby.cumcount

(df.assign(idx=df.groupby('n').cumcount()).melt(['n', 'idx'])
   .pivot(index=['idx', 'variable'], columns='n', values='value')
   .droplevel('idx').rename_axis(index=None, columns=None)
)

输出:

0      1     2
col1     A      A     A
col2   9.6   10.4  11.2
col1     B      B     B
col2   3.3    6.0   4.0
col1     C      C     C
col2  1.94  15.44  6.17
sg24os4d

sg24os4d2#

在下面的方法中,我提取了3个 Dataframe ,以便稍后将它们连接起来。我必须做一些操作才能使其成为正确的格式:

  • 每3行选择一次
  • 调换这3行
  • 从第一行获取列名
  • 删除第一行
  • 附加到列表中

列表中包含3个 Dataframe 后,可以使用pd.concat将它们连接起来

代码:

t_df = []
for i in range (int(len(df)/3)):  
    temp = df.iloc[i*3:(i+1)*3].T
    temp.columns = temp.iloc[0]
    temp = temp[1:]
    t_df.append(temp)

new_df = pd.concat(t_df)
print(new_df)

输出:

n        0      1     2
col1     A      A     A
col2   9.6   10.4  11.2
col1     B      B     B
col2   3.3    6.0   4.0
col1     C      C     C
col2  1.94  15.44  6.17
oknwwptz

oknwwptz3#

其逻辑是:

  • 按“col1”分组并迭代grouper。
  • 对迭代得到的子群进行转置。
  • 连接所有转置的子组。
df_arr = []
for key, sub_df in df.groupby("col1"):
  df_arr.append(sub_df.set_index("n").T)

df = pd.concat(df_arr).rename_axis("", axis="columns")

输出:

0      1     2
col1     A      A     A
col2   9.6   10.4  11.2
col1     B      B     B
col2   3.3    6.0   4.0
col1     C      C     C
col2  1.94  15.44  6.17

相关问题