如何在不使用for循环的情况下获得与以下代码相同的结果:我的典型数据有~500k行,实际上,代码太耗时了。
data={'key1':[1,2,1,1,2,3,2,2],'key2':[2,2,2,2,2,4,2,2],'class':[5,10,'NaN','NaN','NaN',6,'NaN','NaN']}
frame = pd.DataFrame(data,columns=['key1','key2','class'])
此数据框包含一些[key1,key2]
个重复项,例如:[1,2]
和[2,2]
。
副本的第一次出现具有有限'class'
值,而其他重复项被赋予'NaN' class
值。以下代码采用第一次出现的'class'
值并将其分配给同一组的重复项。
for name, group in frame.groupby(['key1', 'key2']):
listOfIndex = group.index
master_idx = listOfIndex[0]
frame['class'].loc[listOfIndex] = frame['class'].loc[master_idx]
key1 key2 class
0 1 2 5
1 2 2 10
2 1 2 5
3 1 2 5
4 2 2 10
5 3 4 6
6 2 2 10
7 2 2 10
答案 0 :(得分:2)
您可以先按key1
和key2
列sort_values
,然后replace
NaN
改为np.nan
,fillna
改{ {1}}列中的{1}}和ffill
列中的class
更改为原始排序:
注意:如果index
列中重复项的第一个值为不 class
,则解决方案有效。
NaN
如果列df = frame.sort_values(by=['key1','key2'])
print df
key1 key2 class
0 1 2 5
2 1 2 NaN
3 1 2 NaN
1 2 2 10
4 2 2 NaN
6 2 2 NaN
7 2 2 NaN
5 3 4 6
df['class'] = df['class'].replace('NaN', np.nan).fillna(method='ffill')
print df.sort_index()
key1 key2 class
0 1 2 5.0
1 2 2 10.0
2 1 2 5.0
3 1 2 5.0
4 2 2 10.0
5 3 4 6.0
6 2 2 10.0
7 2 2 10.0
中的值是整数,则由sort_index
强制转换:
class