【问题标题】:map pandas values to a categorical level将 pandas 值映射到分类级别
【发布时间】:2017-03-12 13:13:57
【问题描述】:

熊猫新手。 R 用户使用拆分、应用、组合模式来分析子群体。例如性别,1='男',2='女',9='未知。

我有一个数据框,其中包含 20,000+ 个值是整数 1 到 7 的数据框,对应于“周一”、“周二”等。我需要使用标签的类别,而不是它们的原始整数值。

我的第一次尝试是尝试 .astype("category"):

import numpy as np
import pandas as pd
dow = pd.DataFrame({'labels': ("Sunday","Monday","Tuesday",\
"Wednesday", "Thursday", "Friday", "Saturday")})

data = pd.DataFrame({'value': [1, 1, 2, 3, 4, 7, 8, 9, 0]})
data['formtatted'] = dow['labels'].astype('category')
data

value   formtatted
0   1   Sunday
1   1   Monday
2   2   Tuesday
3   3   Wednesday
4   4   Thursday
5   7   Friday
6   8   Saturday
7   9   NaN
8   0   NaN

我希望标签映射到两次给出“星期日”的整数值,而不是获取重新循环列表的行为。

接下来我尝试使用 .factorize 属性,例如:

data2 = pd.DataFrame({'values': [1, 1, 2, 3, 4, 7, 8, 9, 0]})
dow2 = pd.DataFrame({'labels': ["Sunday","Monday","Tuesday", \
"Wednesday", "Thursday", "Friday", "Saturday"]})
dow_cat = pd.factorize(dow2['labels'])

dow_cat
(array([0, 1, 2, 3, 4, 5, 6]),
 Index(['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday',
    'Saturday'], dtype='object'))

看起来很有希望。

data2['labels'] = dow_cat[0]

但会引发错误:值的长度与索引的长度不匹配

出现更多搜索: https://github.com/pandas-dev/pandas/blob/master/doc/source/categorical.rst#differences-to-rs-factor

声明:无法在创建时指定标签。之后使用 s.cat.rename_categories(new_labels)。

很公平:

dow3 = pd.DataFrame({'values': [1, 2, 3, 4, 5, 6, 7]},
               dtype="category")

dow3.values = dow3['values'].cat.rename_categories(["Sunday", \
"Monday","Tuesday","Wednesday", \
"Thursday", "Friday", "Saturday"])
df3['formatted'] = dow3["values"]

df3

    values  formatted
0   1   Sunday
1   1   Monday
2   2   Tuesday
3   3   Wednesday
4   4   Thursday
5   7   Friday
6   8   Saturday
7   9   NaN
8   0   NaN

我从哪里开始,具有循环列表的行为。

我敢打赌,我忽略了显而易见的事情,但它让我望而却步。关于我从这里去哪里的建议?

【问题讨论】:

  • 你有什么问题?

标签: python pandas


【解决方案1】:

不确定我是否理解您要执行的操作...也许您将简单的事情复杂化了:这是您想要的吗?如果不是,请提供一个带有输入和预期输出的清晰示例。

data = pd.DataFrame({'values': [1, 1, 2, 3, 4, 7, 8, 9, 0]})
dow = {
    0:"Sunday",
    1:"Monday",
    2:"Tuesday",
    3:"Wednesday", 
    4:"Thursday", 
    5:"Friday", 
    6:"Saturday"
}
data["dow"] = data['values'].map(dow)

print data

结果:

   values        dow
0       1     Monday
1       1     Monday
2       2    Tuesday
3       3  Wednesday
4       4   Thursday
5       7        NaN
6       8        NaN
7       9        NaN
8       0     Sunday

【讨论】:

  • 谢谢你,朱利安。这是我正在寻找的行为。
猜你喜欢
  • 1970-01-01
  • 2012-07-12
  • 1970-01-01
  • 2014-11-15
  • 1970-01-01
  • 1970-01-01
  • 2016-09-02
  • 2020-09-01
  • 1970-01-01
相关资源
最近更新 更多