我正在尝试重新配置熊猫数据框,当前看起来像这样:
A B C D E F
0 7 5 2 1 2 2
1 3 4 3 1 4 6
2 1 3 2 6 5 5
变成这样:
c1 c2 c3
0 7 5 2
0 1 2 2
1 3 4 3
1 1 4 6
2 1 3 2
2 6 5 5
(尝试拆分数据框,然后将后面的切片作为新行放在下面-c1,c2,c3是新的列标签)
答案 0 :(得分:2)
我相信这里是将必要的整形值调整为3列,只有必要的列长模为0
:
print (len(df.columns) % 3)
0
df = pd.DataFrame(df.values.reshape(-1, 3),
columns=[f'c{x}' for x in range(1, 4)],
index = np.repeat(df.index, len(df.columns) / 3))
print (df)
c1 c2 c3
0 7 5 2
0 1 2 2
1 3 4 3
1 1 4 6
2 1 3 2
2 6 5 5
编辑:
我尝试模拟您的问题-添加了新列G
并在3列中获得输出:
print (df)
A B C D E F G
0 7 5 2 1 2 2 10
1 3 4 3 1 4 6 20
2 1 3 2 6 5 5 30
如果需要输出中的所有值,则为末尾的值添加NaN
,因为不存在:
N = 3
c = np.arange(len(df.columns))
df.columns = [c % N, c // N]
df = df.stack().reset_index(drop=True)
df.columns = [f'{x + 1}' for x in df.columns]
print (df)
1 2 3
0 7 5.0 2.0
1 1 2.0 2.0
2 10 NaN NaN
3 3 4.0 3.0
4 1 4.0 6.0
5 20 NaN NaN
6 1 3.0 2.0
7 6 5.0 5.0
8 30 NaN NaN
另一个想法是删除通过索引创建NaN的列-这里的列G
:
N = 3
c = len(df.columns)
last = (c % N)
df = df.iloc[:, :-last]
print (df)
A B C D E F
0 7 5 2 1 2 2
1 3 4 3 1 4 6
2 1 3 2 6 5 5
然后使用原始解决方案:
df = pd.DataFrame(df.values.reshape(-1, 3),
columns=[f'c{x}' for x in range(1, 4)],
index = np.repeat(df.index, len(df.columns) / 3))
print (df)
c1 c2 c3
0 7 5 2
0 1 2 2
1 3 4 3
1 1 4 6
2 1 3 2
2 6 5 5
答案 1 :(得分:0)
如果列数可被3整除,并且您想要唯一的索引名称:
import numpy as np
import pandas as pd
df = pd.DataFrame({'A': [7.0, 3.0, 1.0],
'B': [5.0, 4.0, 3.0],
'C': [2.0, 3.0, 2.0],
'D': [1.0, 1.0, 6.0],
'E': [2.0, 4.0, 5.0],
'F': [2.0, 6.0, 5.0]})
df1 = pd.DataFrame(df.to_numpy().reshape(-1,3), columns = ['c1','c2','c3'])
print(df1)
c1 c2 c3
0 7.0 5.0 2.0
1 1.0 2.0 2.0
2 3.0 4.0 3.0
3 1.0 4.0 6.0
4 1.0 3.0 2.0
5 6.0 5.0 5.0