如何使用python中的替换字典替换另一个数字?

时间:2018-01-26 19:00:46

标签: python pandas dictionary replace

我有两列数字:一列是学生SAT分数的记录,另一列是在python pandas数据帧中的ACT测试的相应分数。

     SAT Score  ACT Score
0       2160.0       32.0
1       1890.0        NaN
2       1720.0       27.0
3       2160.0       34.0
4       2150.0       32.0
5       1310.0       31.0
6       2220.0        NaN
7       2250.0        NaN
8       2170.0        NaN
9       2080.0        NaN
10      2310.0       34.0

我创建的词典如下所示:

score_dict = {"36": 2390, "35":2330, "34": 2260, "33": 2170, "32": 2110, "31": 2040, "30": 1990, "29":1920, "28": 1850, "27": 1810, "26": 1760, "25":1700, "24": 1640, "23": 1570, "22": 1530}"}

当缺少SAT或ACT分数时,我想用各自的dict值替换dict键。我不确定如何完成代码。

M = df['SAT Score']
N = df['ACT Score']

for index in range(len(M)):
    i = N[index]
    k = M[index]
    if k != k *1:
       for key, value in score_dict.items():
            ....

这是我得到的。

我在SAT专栏中有一些NaN值。我的逻辑是先看看他们中的NaNs的SAT分数(k!= k * 1),然后对那些行看相应的ACT分数。然后我会使用字典来查找使用相应的ACT分数替换丢失的SAT分数  字典。

2 个答案:

答案 0 :(得分:0)

我不确定这是否正是您正在寻找的答案。但至少,看看DataFrames的子集如何工作以及如何在这样的DataFrame上使用map函数可能会有所帮助。

首先让我们做一些设置

>>> score_dict = {'36': 2390, '35': 2330, '34': 2260, '33':2200}
>>> invert_score_dict = {v:k for k, v in score_dict.items()}
>>> data1 = [["Bob", "36"], ["Nancy", "35"], ["Billy", "34"], ["Suzy", "33"]]
>>> data2 = [["Bob", 2390], ["Nancy", 2330], ["Billy", 2260], ["Rachel", 2200]]
>>> act = pd.DataFrame(data=data1, columns=['name', 'score'])
>>> sat = pd.DataFrame(data=data2, columns=['name', 'score'])
>>> act
    name score
0    Bob    36
1  Nancy    35
2  Billy    34
3   Suzy    33
>>> sat
     name  score
0     Bob   2390
1   Nancy   2330
2   Billy   2260
3  Rachel   2200

现在我在这里做了一些假设,因为我不知道你的DF是什么样的。但它应该至少有点说明。

>>> act.merge(sat, on=['name'], how='outer', suffixes=['_act', '_sat']indicator='exists_in')
     name score_act  score_sat   exists_in
0     Bob      36   2390.0        both
1   Nancy      35   2330.0        both
2   Billy      34   2260.0        both
3    Suzy      33      NaN   left_only
4  Rachel     NaN   2200.0  right_only

这里我只是将它们合并,以便确保它们位于同一个DataFrame中。

下面我只是使用pandas loc来帮助抓取DataFrame的一个子集,并根据score_dictinverted_score_dict

填写默认值
>>> merged_scores.loc[merged_scores.score_sat.isnull(), 'score_sat'] = 
merged_scores.score_act.map(score_dict)

>>> merged_scores
name score_act  score_sat   exists_in
0     Bob        36     2390.0        both
1   Nancy        35     2330.0        both
2   Billy        34     2260.0        both
3    Suzy        33     2200.0   left_only
4  Rachel       NaN     2200.0  right_only
>>> merged_scores.loc[merged_scores.score_act.isnull(), 'score_act'] = 
merged_scores.score_sat.map(invert_score_dict)
>>> merged_scores
     name score_act  score_sat   exists_in
0     Bob        36     2390.0        both
1   Nancy        35     2330.0        both
2   Billy        34     2260.0        both
3    Suzy        33     2200.0   left_only
4  Rachel        33     2200.0  right_only

答案 1 :(得分:0)

var tokensFriendCount = distinctFriendList.Where(f => f.oToken != null) .SelectMany(f => distinctFriendList.Where(f2 => f2.oToken != null && f2.FriendID > f.FriendID).Select(f2 => new[] { f, f2 })) .Select(fp => new { Friend1 = fp[0], Friend2 = fp[1], SharedCount = fp[0].oToken.Select(t => t.TokenId).Intersect(fp[1].oToken.Select(t => t.TokenId)).Count() }) .Where(fpc => fpc.SharedCount > 0); 中,依靠pandas操作。你几乎不想使用for循环。

所以,给定:

pandas

注意,我不得不反转你提供的字典的映射,因为那个映射的ACT得分(奇怪的是,作为字符串)到SAT分数,但你需要反过来如果ACT分数是In [56]: df Out[56]: SAT ACT 0 2160.0 32.0 1 1890.0 NaN 2 1720.0 27.0 3 2160.0 34.0 4 2150.0 32.0 5 1310.0 31.0 6 2220.0 NaN 7 2250.0 NaN 8 2170.0 NaN 9 2080.0 NaN 10 2310.0 34.0 In [58]: score_dict Out[58]: {1530: 22, 1570: 23, 1640: 24, 1700: 25, 1760: 26, 1810: 27, 1850: 28, 1920: 29, 1990: 30, 2040: 31, 2110: 32, 2170: 33, 2260: 34, 2330: 35, 2390: 36} 的分数。

无论如何,做选择,例如其中ACT为NaN,我们选择NaN.isnull

loc

现在,如果您想使用dict来映射值,In [66]: df.loc[df.ACT.isnull(),'ACT'] Out[66]: 1 NaN 6 NaN 7 NaN 8 NaN 9 NaN Name: ACT, dtype: float64 方法会自动执行此操作:

pd.Series.map

名称:SAT,dtype:float64

所以,你可以使用上面的代替(注意,你的dict只涉及一个案例......)

In [67]: df.loc[df.ACT.isnull(), 'SAT'].map(score_dict)
Out[67]:
1     NaN
6     NaN
7     NaN
8    33.0
9     NaN