使用现有列和一个字典创建Pandas新列

3

我有一个类似这样的数据框:

df = pd.DataFrame({"user_id" : ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'],
                   "score" : [0, 100, 50, 0, 25, 50, 100, 0, 7, 20],
                  "valval" : ["va2.3", "va1.1", "va2.1", "va2.2", "va1.2",
                             "va1.1", "va2.1", "va1.2", "va1.2", "va1.3"]})
   
print(df)


     | user_id | score | valval 
-----+---------+-------+--------
 0   |     a   |    0  | va2.3  
 1   |     b   |  100  | va1.1  
 2   |     c   |   50  | va2.1  
 3   |     d   |    0  | va2.2  
 4   |     e   |   25  | va1.2  
 5   |     f   |   50  | va1.1  
 6   |     g   |  100  | va2.1  
 7   |     h   |    0  | va1.2  
 8   |     i   |    7  | va1.2  
 9   |     j   |   20  | va1.3  

我还有一个类似的字典:

dic_t = { "key1" : ["va1.1", "va1.2", "va1.3"], "key2" : ["va2.1", "va2.2", "va2.3"]}

我想要一个新列“keykey”。

该列的值具有其对应值的字典键。

结果可能如下所示:

     | user_id | score | valval | keykey 
----------------------------------------
 0   |     a   |    0  | va2.3  | key2
 1   |     b   |  100  | va1.1  | key1
 2   |     c   |   50  | va2.1  | key2
 3   |     d   |    0  | va2.2  | key2
 4   |     e   |   25  | va1.2  | key1
 5   |     f   |   50  | va1.1  | key1
 6   |     g   |  100  | va2.1  | key2
 7   |     h   |    0  | va1.2  | key1
 8   |     i   |    7  | va1.2  | key1
 9   |     j   |   20  | va1.3  | key1
3个回答

3

在将字典展平后,您可以使用series.map方法。

d = {val:k for k,v in dic_t.items() for val in v}
df['keykey'] = df['valval'].map(d)

print(df)

  user_id  score valval keykey
0       a      0  va2.3   key2
1       b    100  va1.1   key1
2       c     50  va2.1   key2
3       d      0  va2.2   key2
4       e     25  va1.2   key1
5       f     50  va1.1   key1
6       g    100  va2.1   key2
7       h      0  va1.2   key1
8       i      7  va1.2   key1
9       j     20  va1.3   key1

0

这不是最有效的解决方案,但可以解决问题,并且易于理解和跟随


def get_keykey(search_val, ref_dict):
    for key in ref_dict:                       # loop over all keys
        if search_val in ref_dict[key]:        # if valval is in list of values associated with key, return that key, else will return None
            return key

# apply to val column of df

df["keykey"] = df["valval"].apply(get_keykey, args = (ref_dict,))


0

更新空字典并使用map函数

import pandas as pd
df = pd.DataFrame({"user_id" : ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'],
                   "score" : [0, 100, 50, 0, 25, 50, 100, 0, 7, 20],
                   "valval" : ["va2.3", "va1.1", "va2.1", "va2.2", "va1.2", "va1.1", "va2.1", "va1.2", "va1.2", "va1.3"]})

dic_t = { "key1" : ["va1.1", "va1.2", "va1.3"], "key2" : ["va2.1", "va2.2", "va2.3"]}

d_keykey = {}
for k, v in dic_t.items():
    for val in v:
        d_keykey.update({val: k})
df["keykey"] = df["valval"].map(d_keykey)
print(df)


  user_id  score valval keykey
0       a      0  va2.3   key2
1       b    100  va1.1   key1
2       c     50  va2.1   key2
3       d      0  va2.2   key2
4       e     25  va1.2   key1
5       f     50  va1.1   key1
6       g    100  va2.1   key2
7       h      0  va1.2   key1
8       i      7  va1.2   key1
9       j     20  va1.3   key1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接