【问题标题】:Pandas: Efficient way of creating new column based on other column. Many to fewPandas:基于其他列创建新列的有效方法。多到少
【发布时间】:2016-05-24 02:57:40
【问题描述】:

例如:

df = pd.DataFrame( {"A": [7001, 8001, 9001]} )
equiv = {1:[7001, 8001], 2: [9001]}
df["B"] = df["A"].map(equiv.get)

结束
a, b
7001, 1
8001, 1
9001, 2

我在想这样的事情:

df = pd.DataFrame( {"A": [7001, 8001, 9001]} )
equiv = {1:[7001, 8001], 2: 9001}
df["B"] = df["A"].map(equiv.get)

我不想使用equiv = {7001:1, 8001:1, 9001:2},因为在我的实际数据集中我会有很多字符串值映射到12

【问题讨论】:

  • 为什么值 9001 不在一个元素中 list[9001]
  • @jezrael 哦,感谢那些错别字!
  • 我可以将9001 放在一个元素list 中,但这不会达到我的目标。也许那看起来会更干净......我会更新它!
  • 谢谢。您如何看待解决方案将dictionary of lists 更改为inverted dictionary 然后使用mapd = dict( (v,k) for k in equiv for v in equiv[k] )df["B"] = df["A"].map(d)
  • 我不完全理解...我将不得不谷歌/考虑一下...但根据我的粗略理解,这可能有效!

标签: python-2.7 dictionary pandas apply


【解决方案1】:

您可以使用inverted dictionary 然后map 它:

import pandas as pd

df = pd.DataFrame( {"A": [7001, 8001, 9001]} )
print df
      A
0  7001
1  8001
2  9001

equiv = {1:[7001, 8001], 2: [9001]}

d = dict( (v,k) for k in equiv for v in equiv[k] )
print d
{7001: 1, 9001: 2, 8001: 1}

df["B"] = df["A"].map(d)
print df
      A  B
0  7001  1
1  8001  1
2  9001  2

【讨论】:

  • 谢谢,这正是我要找的!
猜你喜欢
  • 2021-12-30
  • 2016-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-03
  • 1970-01-01
相关资源
最近更新 更多