我有两列数字:一列是学生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分数 字典。
答案 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_dict
和inverted_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