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个函数合并为一个 – 可能会融化,但现在它没有实现.也许在一些新版本的熊猫中.然后我的答案会更新.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。