来自两列的熊猫数据框类别代码

Posted

技术标签:

【中文标题】来自两列的熊猫数据框类别代码【英文标题】:pandas dataframe category codes from two columns 【发布时间】:2018-06-27 12:42:03 【问题描述】:

我有一个 pandas 数据框,其中两列对应于人名。列是相关的,相同的名称表示同一个人。我想分配类别代码,使其对整个“名称”空间都有效。

例如我的数据框是

df = pd.DataFrame("P1":["a","b","c","a"], "P2":["b","c","d","c"])

>>> df
  P1 P2
0  a  b
1  b  c
2  c  d
3  a  c

我希望将其替换为相应的类别代码,这样

>>> df
   P1  P2
0   1   2
1   2   3
2   3   4
3   1   3

类别实际上是从串联数组 ["a","b","c","d"] 派生的,并分别应用于各个列。我怎样才能做到这一点?。

【问题讨论】:

【参考方案1】:

用途:

print (df.stack().rank(method='dense').astype(int).unstack())
   P1  P2
0   1   2
1   2   3
2   3   4
3   1   3

编辑:

对于更通用的解决方案,我使用了另一个答案,因为索引中的重复问题:

df = pd.DataFrame("P1":["a","b","c","a"],
                   "P2":["b","c","d","c"],
                   "A":[3,4,5,6], index=[2,2,3,3])

print (df)
   A P1 P2
2  3  a  b
2  4  b  c
3  5  c  d
3  6  a  c

cols = ['P1','P2']
df[cols] = (pd.factorize(df[cols].values.ravel())[0]+1).reshape(-1, len(cols))
print (df)
   A  P1  P2
2  3   1   2
2  4   2   3
3  5   3   4
3  6   1   3

【讨论】:

如果我还有其他列,其中包含其他信息怎么办?我可以堆叠和取消堆叠特定的列吗? 我认为是的,但这主要取决于数据 当我给 df.stack(['P3','P7']) 堆叠第 3 列和第 7 列时,我收到错误“ValueError:级别应包含所有级别名称或所有级别编号,而不是两者的混合。” 我测试了一下,需要cols = df.columns.difference(['P1','P2']).tolist() df = df.set_index(cols).stack().rank(method='dense').astype(int).unstack().reset_index().reindex(columns=df.columns) 它给了我,ValueError:索引包含重复的条目,无法重塑【参考方案2】:

你可以的

In [465]: pd.DataFrame((pd.factorize(df.values.ravel())[0]+1).reshape(df.shape), 
                       columns=df.columns)
Out[465]:
   P1  P2
0   1   2
1   2   3
2   3   4
3   1   3

【讨论】:

以上是关于来自两列的熊猫数据框类别代码的主要内容,如果未能解决你的问题,请参考以下文章

熊猫数据框的索引目前是两列的“分组依据”,但我希望它们作为自己的列,并带有标准数字索引

根据两列的值选择熊猫数据框行

如何根据合并的数据框之一的两列的值在熊猫数据框中添加值

比较两列的熊猫数据框,如果不同,则使用正确的列之一

熊猫,对于每一行获取两列之间最大列的值

python:两列的组合