如何在熊猫中拆分几列的数据?



我有一个数据帧,看起来像这样:

df = pd.DataFrame({'hard': [['525', '21']], 'soft': [['1525', '221']], 'set': [['5245', '271']],  'purch': [['925', '201']], 
'mont': [['555', '621']], 'gest': [['536', '251']], 'memo': [['825', '241']], 'raw': [['532', '210']]})
df
Out:
gest        hard        memo        mont        purch       raw         set         soft
0   [536, 251]  [525, 21]   [825, 241]  [555, 621]  [925, 201]  [532, 210]  [5245, 271] [1525, 221]

我应该像这样拆分所有列:

df1 = pd.DataFrame()
df1['gest_pos'] = df.gest.str[0].astype(int)
df1['gest_size'] = df.gest.str[1].astype(int)
df1['hard_pos'] = df.hard.str[0].astype(int)
df1['hard_size'] = df.hard.str[1].astype(int)
df1 
gest_pos    gest_size   hard_pos    hard_size
0   536         251         525         21

我有70多个专栏,我的方法需要很多时间和地点。有没有更简单的方法做这项工作?

谢谢!

不同的方法:

df2 = pd.DataFrame()
for column in df:
df2['{}_pos'.format(column)] = df[column].str[0].astype(int)
df2['{}_size'.format(column)] = df[column].str[1].astype(int)
print(df2)

您可以使用带有扁平化的嵌套列表理解,然后通过构造函数创建新的DataFrame

L = [[y for x in z for y in x] for z in df.values.tolist()]
#if want filter first 2 values per each list
#L = [[y for x in z for y in x[:2]] for z in df.values.tolist()]
#https://stackoverflow.com/a/45122198/2901002
def mygen(lst):
for item in lst:
yield item + '_pos'
yield item + '_size'
df = pd.DataFrame(L, columns = list(mygen(df.columns))).astype(int)
print (df)
hard_pos hard_size soft_pos soft_size set_pos set_size purch_pos purch_size  
0      525        21     1525       221    5245      271       925        201   
mont_pos mont_size gest_pos gest_size memo_pos memo_size raw_pos raw_size  
0      555       621      536       251      825       241     532      210  

您可以使用NumPy操作来构建列列表并展平您的一系列列表:

import numpy as np
from itertools import chain
# create column label array
cols = np.repeat(df.columns, 2).values
cols[::2] += '_pos'
cols[1::2] += '_size'
# create data array
arr = np.array([list(chain.from_iterable(i)) for i in df.values]).astype(int)
# combine with pd.DataFrame constructor
res = pd.DataFrame(arr, columns=cols)

结果:

print(res)
gest_pos  gest_size  hard_pos  hard_size  memo_pos  memo_size  mont_pos  
0       536        251       525         21       825        241       555   
mont_size  purch_pos  purch_size  raw_pos  raw_size  set_pos  set_size  
0        621        925         201      532       210     5245       271   
soft_pos  soft_size  
0      1525        221  

最新更新