来自两列的熊猫数据框类别代码
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
【讨论】:
以上是关于来自两列的熊猫数据框类别代码的主要内容,如果未能解决你的问题,请参考以下文章