根据另一列中的值更新特定列中的值

问题描述 投票:1回答:2

抱歉这个小问题。

我在根据另一列中的值选择和替换列表中的值时遇到了麻烦。我有以下列表:

Jack     0.794938   0
Marc     0.05155265 0
Eliza    0.96454115 0
Louis    0.075102   0
Milo     0.951499   0
Marc     0.63319    0
Michael  0.719391   0
Louis    0.502843   0
Eliza    0.620387   0

我想保留每个名称的第一次出现,第三列采用第二次出现的第二列的值。所以结果应该是:

Jack     0.794938   0
Marc     0.05155265 0.63319
Eliza    0.96454115 0.620387
Louis    0.075102   0.502843
Milo     0.951499   0
Michael  0.719391   0

我正在使用此代码:

res = []
already_added = set()
for e in a:
    key1 = e[0]
if key1 not in already_added:
    res.append(e)

从那时起,我想要像:

else:
        res[res[:][0] == e[0]][2] = e[1]

要么

else:
        res[np.where(res[:][0] == e[0]][2])] = e[1]

但我一直得到TypeError:list索引必须是整数或切片,而不是list。有人可以帮我解决这个问题吗?

谢谢

编辑:我纠正了指数

python numpy slice
2个回答
1
投票

这是一个纯粹的numpy解决方案。它按第一列对记录进行排序,以便轻松找到重复的名称。

import numpy as np


data = """
Jack     0.794938   0
Marc     0.05155265 0
Eliza    0.96454115 0
Louis    0.075102   0
Milo     0.951499   0
Marc     0.63319    0
Michael  0.719391   0
Louis    0.502843   0
Eliza    0.620387   0
"""

data = (line.split() for line in data.strip().split('\n'))
data = np.array([(x, float(y), float(z)) for x, y, z in data], dtype=object)

res = data.copy()
idx = np.argsort(res[:, 0], kind='mergesort')
dupl = res[idx[:-1], 0] == res[idx[1:], 0]
res[idx[:-1][dupl], 2] = res[idx[1:][dupl], 1]
mask = np.ones(res.shape[:1], dtype=bool)
mask[idx[1:][dupl]] = False
res = res[mask]

结果:

# array([['Jack', 0.794938, 0.0],
#        ['Marc', 0.05155265, 0.63319],
#        ['Eliza', 0.96454115, 0.620387],
#        ['Louis', 0.075102, 0.502843],
#        ['Milo', 0.951499, 0.0],
#        ['Michael', 0.719391, 0.0]], dtype=object)

0
投票

您可以使用Pandas:将值加载到数据帧中,df:

csvfile = StringIO("""Jack     0.794938   0
Marc     0.05155265  0
Eliza    0.96454115  0
Louis    0.075102    0
Milo     0.951499    0
Marc     0.63319     0
Michael  0.719391    0
Louis    0.502843    0
Eliza    0.620387    0""")

df= pd.read_csv(csvfile, header=None, sep='\s\s+')

然后,使用groupbyunstack

df.groupby(0).apply(lambda x: pd.Series(x[1].tolist()))\
  .unstack().add_prefix('value').reset_index()

输出:

         0    value0    value1
0    Eliza  0.964541  0.620387
1     Jack  0.794938       NaN
2    Louis  0.075102  0.502843
3     Marc  0.051553  0.633190
4  Michael  0.719391       NaN
5     Milo  0.951499       NaN
© www.soinside.com 2019 - 2024. All rights reserved.