Pandas/Python - 每 X 行将一列转换为新列

问题描述 投票:0回答:2

我有一列包含需要拆分并适合其他列的值:

column_ex = [Tony, Male,25, Salesman, Jane, Female, 32, Nurse, Bob, Male, 33, Engineer]

我还有一个数据框:

column_headers = ['name','gender','age','job']
df = pd.DataFrame(columns = column_headers)

我想采用 column_ex 并采用每 4 个值来适应我的数据框。我该怎么做呢? R好像有

as.data.frame(split(data, 1:x))

  • 有 pandas 的等价物吗?

谢谢!

python pandas
2个回答
2
投票

您可以使用 numpy 的 split 在读入数据帧之前分割数据:

#convert column_headers to numpy array
column_ex = np.array(column_ex)
#split into equal numbers
n = len(column_ex)/4
split_data = np.split(column_ex,n)
#read split data into a dataframe
df = pd.DataFrame(split_data, columns = column_headers)

另一个选项是 itertool 的 slicerange 的组合:

from itertools import islice
split = [islice(column_ex,part,part+4)
         for part in 
         range(0,len(column_ex),4)]
df = pd.DataFrame(split,columns = column_headers)

或者,您可以使用 toolz partition 方法:

from toolz import partition
#split data 
split_data = partition(4,column_ex)
#read split_data into dataframe
df = pd.DataFrame(split_data, columns = column_headers)
print(df)

    name    gender  age job
0   Tony    Male    25  Salesman
1   Jane    Female  32  Nurse
2   Bob Male    33  Engineer

0
投票

我认为这可以解决问题,它将动态分配每一列,但对于大列,它可能会很慢

count = 0
for i in range(len(column_headers)):
    df.loc[:, column_headers[i]] = [column_ex[x] for x in range(count, len(column_ex), 4)]
    count += 1

其他解决方案可以使用 numpy 和

reshape
方法完成,效率更高:

import numpy as np
np_array = np.array(column_ex)
df = pd.DataFrame(np_array.reshape((-1, 4)), columns=column_headers)
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.