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个函数合并为一个 – 可能会融化,但现在它没有实现.也许在一些新版本的熊猫中.然后我的答案会更新.

相关文章

转载:一文讲述Pandas库的数据读取、数据获取、数据拼接、数...
Pandas是一个开源的第三方Python库,从Numpy和Matplotlib的基...
整体流程登录天池在线编程环境导入pandas和xrld操作EXCEL文件...
 一、numpy小结             二、pandas2.1为...
1、时间偏移DateOffset对象DateOffset类似于时间差Timedelta...
1、pandas内置样式空值高亮highlight_null最大最小值高亮背景...