Pandas从字典映射到DataFrame

时间:2015-06-20 20:39:50

标签: python dictionary pandas

我目前通过此函数映射并将各种字符串值重命名为pandas中的列:

df["fundbenchmark"] = df["name"].map(lambda x: "American Express" if "AXP" in x else "Apple" if "AAPL" in x else "Google" if "GOOG" in x else "")

然而,我会为几个列和许多不同的重命名执行此操作。这是另一个内容相同的专栏,所以在那里添加所有公司也是重复的。

df["subclass"] = df["name"].map(lambda x: "American Express" if "AXP" in x else "Apple" if "AAPL" in x else "Google" if "GOOG" in x else "")

因此我想维护一本字典:

companies = {"AXP": "American Express", "AAPL": "Apple", "GOOG": "Google"}

并在我需要映射公司名称时调用所有实例。如何为map而不是companies中的匹配设置lambda x

当前DataFrame:

Name              
"BULL AXP UN X3 VON"
"BEAR AXP UN X3 VON"
"BULL GOOG UN X5 VON"
"BEAR GOOG UN X5 VON"
"BEAR ABC123 X2 CBZ"

期望的输出:

Name                    Fundbenchmark             Subclass
"BULL AXP UN X3 VON"      "American Express"      "American Express"
"BEAR AXP UN X3 VON"      "American Express"      "American Express"
"BULL GOOG UN X5 VON"     "Google"                "Google"
"BEAR GOOG UN X5 VON"     "Google"                "Google"
"BEAR ABC123 X2 CBZ"      "BEAR ABC123 X2 CBZ"    "BEAR ABC123 X2 CBZ" #Not in Dictionary

字典:

companies = {"AXP": "American Express", "GOOG": "Google"} 

因此,如果字典中存在缩写,则将该名称写入其他列。

或者,如果缩写不在字典中,则复制整个单元格。

3 个答案:

答案 0 :(得分:2)

您可以使用map

Current DataFrame:

Name              
"BULL AXP UN X3 VON"
"BEAR AXP UN X3 VON"
"BULL GOOG UN X5 VON"
"BEAR GOOG UN X5 VON"
"BEAR ABC123 X2 CBZ"


companies = {"AXP": "American Express", "GOOG": "Google"} 

我们创建了一个新列,用于从列中提取代码。

df['Tickers'] = df.Name.str.split(' ').apply(lambda x: x[1])

然后我们使用您的字典companies映射到代码,以创建一个包含代码符号名称的列:

df['Ticker_Name'] = df['Tickers'].map(companies)

答案 1 :(得分:1)

使用替换:

http://pandas.pydata.org/pandas-docs/dev/generated/pandas.DataFrame.replace.html

 df = pd.DataFrame({'A':['string1','string2','string3'],
                 'B':['StringA','StringB','StringC']})

创建:

             A        B
    0  string1  StringA
    1  string2  StringB
    2  string3  StringC

然后将替换词映射到字典中:

to_replace = {'string1':'replace1','StringC':'replaceC'}

然后替换:

 df.replace(to_replace)
          A         B
0  replace1   StringA
1   string2   StringB
2   string3  replaceC

答案 2 :(得分:1)

我怀疑这是最优雅的方式,但应该可以解决这个问题:

df['fbm'] = df['name']
for i in companies:
    df.loc[ df.name.str.contains(i), 'fbm' ] = companies[i]

                  name                 fbm
0   BULL AXP UN X3 VON    American Express
1   BEAR AXP UN X3 VON    American Express
2  BULL GOOG UN X5 VON              Google
3  BEAR GOOG UN X5 VON              Google
4   BEAR ABC123 X2 CBZ  BEAR ABC123 X2 CBZ

这里要记住的一件事是,因为这不是字典查找,所以可以有多个匹配。例如,' ABC'和联合国'都是有效的代码和' BEAR'是或是。使用此方法,将保留最后一个匹配并丢弃任何先前的匹配。