更新重复项的单元格值而不使用for循环

时间:2016-05-02 07:43:32

标签: pandas duplicates

如何在不使用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

1 个答案:

答案 0 :(得分:2)

您可以先按key1key2sort_values,然后replace NaN改为np.nanfillna改{ {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