重塑熊猫数据框的最佳方法

时间:2018-10-05 20:20:10

标签: python pandas dataframe

我有一个这样的一维数据框设置:

[A1,B1,C1,A2,B2,C2,A3,B3,C3,A4,B4,C4,A5,B5,C5,A6,B6,C6]

在我的程序A1中,...,C6是从csv读取的数字。 我想将其重塑成这样的2d数据框:

[A1,B1,C1]
[A2,B2,C2]
[A3,B3,C3]
[A4,B4,C4]
[A5,B5,C5]
[A6,B6,C6]

我可以使用循环进行此操作,但是由于我将多次进行此转换,因此它将使程序运行速度大大降低。以这种方式重塑数据的最佳命令是什么?我看了一堆重塑数据框的问题,但找不到与此相关的任何东西。预先感谢。

4 个答案:

答案 0 :(得分:6)

设置

s = "A1,B1,C1,A2,B2,C2,A3,B3,C3,A4,B4,C4,A5,B5,C5,A6,B6,C6".split(',')

使用Numpy

pd.DataFrame(np.array(s).reshape(-1, 3))

    0   1   2
0  A1  B1  C1
1  A2  B2  C2
2  A3  B3  C3
3  A4  B4  C4
4  A5  B5  C5
5  A6  B6  C6

迭代器恶作剧

pd.DataFrame([*zip(*[iter(s)]*3)])

    0   1   2
0  A1  B1  C1
1  A2  B2  C2
2  A3  B3  C3
3  A4  B4  C4
4  A5  B5  C5
5  A6  B6  C6

答案 1 :(得分:3)

在分析列表时使用跨步(步骤),并假设数据采用您提供的格式。

s = [A1,B1,C1,A2,B2,C2,A3,B3,C3,A4,B4,C4,A5,B5,C5,A6,B6,C6]

请注意,如果s最初是具有一行和18列的数据帧,则可以通过以下方式将其转换为列表:

s = s.T.iloc[:, 0].tolist()

然后通过以下方法将结果转换为您选择的尺寸的数据框:

df = pd.DataFrame({'A': s[::3], 'B': s[1::3], 'C': s[2::3]})

更一般地:

s = range(18)

cols = 3
>>> pd.DataFrame([s[n:(n + cols)] for n in range(0, len(s), cols)])
    0   1   2
0   0   1   2
1   3   4   5
2   6   7   8
3   9  10  11
4  12  13  14
5  15  16  17

答案 2 :(得分:1)

使用list拆分

[s[x:x+3] for x in range(0, len(s),3)]
Out[1151]: 
[['A1', 'B1', 'C1'],
 ['A2', 'B2', 'C2'],
 ['A3', 'B3', 'C3'],
 ['A4', 'B4', 'C4'],
 ['A5', 'B5', 'C5'],
 ['A6', 'B6', 'C6']]

#pd.DataFrame([s[x:x+3] for x in range(0, len(s),3)])

答案 3 :(得分:1)

我将调整数组的形状,并确保将order参数设置为“ A”

mylist = np.array(['a1', 'b1', 'c1', 'a2', 'b2', 'c2', 'a3', 'b3', 'c3', 'a4', 'b4', 'c4', 'a5','b5', 'c5', 'a6', 'b6', 'c6'])

reshapedList = mylist.reshape((6, 3), order = 'A')

print(mylist)

>>>  ['a1' 'b1' 'c1' 'a2' 'b2' 'c2' 'a3' 'b3' 'c3' 'a4' 'b4' 'c4' 'a5' 'b5' 'c5' 'a6' 'b6' 'c6']


print(reshapedList)

[['a1' 'b1' 'c1']
 ['a2' 'b2' 'c2']
 ['a3' 'b3' 'c3']
 ['a4' 'b4' 'c4']
 ['a5' 'b5' 'c5']
 ['a6' 'b6' 'c6']]

如果要使用熊猫数据框,则可以按以下方式获取它。

df = pd.DataFrame(mylist.reshape((6, 3), order = 'A'), columns = list('ABC'))

>>> df

    A   B   C
0   a1  b1  c1
1   a2  b2  c2
2   a3  b3  c3
3   a4  b4  c4
4   a5  b5  c5
5   a6  b6  c6

注意: 请务必花一些时间检查dataframearray之间的差异。您的问题涉及数据帧,但是您真正的意思是数组