【发布时间】:2017-01-07 09:28:55
【问题描述】:
我想学习如何将数据框列作为从多个列映射的代码。
在下面的部分示例中,我尝试了一种可能是笨拙的方法:获取唯一值作为临时数据框;将一些前缀字符串连接到临时行号作为新列,然后它们加入 2 个数据框。
df = pd.DataFrame({'col1' : ['A1', 'A2', 'A1', 'A3'],
'col2' : ['B1', 'B2', 'B1', 'B1'],
'value' : [100, 200, 300, 400],
})
tmp = df[['col1','col2']].drop_duplicates(['col1', 'col2'])
# col1 col2
# 0 A1 B1
# 1 A2 B2
# 3 A3 B1
第一个问题是如何获取 'temp' 行号及其值到 tmp 列?
从 df 获得以下结果的聪明的 Python 方法是什么?
dfnew = pd.DataFrame({'col1' : ['A1', 'A2', 'A1', 'A3'],
'col2' : ['B1', 'B2', 'B1', 'B1'],
'code' : ['CODE0','CODE1', 'CODE0', 'CODE3'],
'value' : [100, 200, 300, 400],
})
code col1 col2 value
0 CODE0 A1 B1 100
1 CODE1 A2 B2 200
2 CODE0 A1 B1 300
3 CODE3 A3 B1 400
谢谢。
在得到答案之后,作为一个练习,我继续研究我想到的非 Python 版本,并从出色的答案中获得了见解,并达到了这一点:
tmp = df[['col1','col2']].drop_duplicates(['col1', 'col2'])
tmp.reset_index(inplace=True)
tmp.drop('index', axis=1, inplace=True)
tmp['code'] = tmp.index.to_series().apply(lambda x: 'code' + format(x, '04d'))
dfnew = pd.merge(df, tmp, on=['col1', 'col2'])
在发布此问题时,我没有意识到将索引重置为具有新序列而不是原始索引号会更好。
我尝试了一些变体,但我不知道如何在一个命令中链接“reset_index”和“drop”。
我开始喜欢 Python。谢谢大家。
【问题讨论】: