ts | thing_0 | qty_0 | thing_1 | qty_1 | thing_2 | qty_2
--------------------------------------------------------
1 | dog | 5 | cat | 3 | mouse | 1
2 | house | 6 | dog | 4 | cat | 2
...
我希望以一种事物变成列并且qtys成为单元格值的方式对其进行转换.像这样:
ts | dog | cat | mouse | house
------------------------------
1 | 5 | 3 | 1 | 0
2 | 4 | 2 | 0 | 6
...
目前,我通过手动迭代df.values数组手动进行此转换,但这非常慢.有没有更快的方法来实现这个庞大的熊猫手段?
我见过df.pivot,但找不到描述thing_0和qty_0之间关系的方法.
解决方法:
您可以在str.split
之前从列创建MultiIndex,然后在stack
和unstack
之前重新整形:
df = df.set_index('ts')
df.columns = df.columns.str.split('_', expand=True)
df = df.stack().reset_index(level=1, drop=True)
.set_index('thing', append=True)['qty'].unstack(fill_value=0)
print (df)
thing cat dog house mouse
ts
1 3 5 0 1
2 2 4 6 0
df = df.set_index('ts')
df.columns = df.columns.str.split('_', expand=True)
df = df.stack().reset_index()
df = df.pivot(index='ts', columns='thing', values='qty').fillna(0).astype(int)
print (df)
thing cat dog house mouse
ts
1 3 5 0 1
2 2 4 6 0
第三种解决方案 – 为lreshape
动态创建dict,然后使用unstack
:
注意 – 必须对列进行排序,否则添加df = df.sort_index(axis = 1)
t = [x for x in df.columns if x.startswith('thing')]
q = [x for x in df.columns if x.startswith('qty')]
df = pd.lreshape(df, {'thing':t, 'qty':q})
.set_index(['ts','thing'])['qty'].unstack(fill_value=0)
print (df)
thing cat dog house mouse
ts
1 3 5 0 1
2 2 4 6 0
编辑:
lreshape
现在没有记录,但将来可能会删除(with pd.wide_to_long too).
可能的解决方案是将所有3个函数合并为一个 – 可能会融化,但现在它没有实现.也许在一些新版本的熊猫中.然后我的答案会更新.