微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python – Pandas:将列对转换为单元格

我有一个像这样的pandas数据框:

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,然后在stackunstack之前重新整形:

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

pivot的另一个解决方案是取消堆栈:

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 举报,一经查实,本站将立刻删除。

相关推荐