向下移动列并复制 pandas 中的键

Moving columns down and replicating keys in pandas

我有以下数据框:

ID first mes1.1 mes 1.2 ... mes 1.10 mes2.[1-10] mes3.[1-10] 123df John 5.5 130 45 [12,312,...] [123,346,53] ...

其中我使用 [] 符号缩写了列。所以在这个数据框中我有 31 列:firstmes1.[1-10]mes2.[1-10]mes3.[1-10]。每行都由一个唯一索引作为键:ID

我想形成一个新的 table,其中我复制了所有列值(此处由 IDfirst 表示)并移动 mes2mes3 列(其中 20 个)"down" 给我这样的东西:

ID first mes1 mes2 ... mes10 123df John 5.5 130 45 123df John 341 543 53 123df John 123 560 567 ...

# How I set up your dataframe (please include a reproducible df next time)
df = pd.DataFrame(np.random.rand(6,31), index=["ID" + str(i) for i in range(6)], 
columns=['first'] + ['mes{0}.{1}'.format(i, j) for i in range(1,4) for j in range(1,11)])
df['first'] = 'john'

那么有两种方法可以做到这一点

# Generate new underlying array
first = np.repeat(df['first'].values, 3)[:, np.newaxis]
new_vals = df.values[:, 1:].reshape(18,10)
new_vals = np.hstack((first, new_vals))
# Create new df
m = pd.MultiIndex.from_product((df.index, range(1,4)), names=['ID', 'MesNum'])
pd.DataFrame(new_vals, index=m, columns=['first'] + list(range(1,11)))

或仅使用 Pandas

df.columns = ['first'] + list(range(1,11))*3
pieces = [df.iloc[:, i:i+10] for i in range(1,31, 10)]
df2 = pd.concat(pieces, keys = ['first', 'second', 'third'])
df2 = df2.swaplevel(1,0).sortlevel(0)
df2.insert(0, 'first', df['first'].repeat(3).values)