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

时间:2018-08-02 07:42:16

标签: python pandas dataframe

我有一个看起来像这样的数据框:

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多个专栏,我的方法花费了大量的时间和时间。有更简单的方法来完成这项工作吗?

谢谢!

3 个答案:

答案 0 :(得分:2)

您可以将嵌套列表推导与扁平化结合使用,然后通过构造函数创建新的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  

答案 1 :(得分:2)

不同的方法:

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)

答案 2 :(得分:1)

您可以使用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