抱歉这个小问题。
我在根据另一列中的值选择和替换列表中的值时遇到了麻烦。我有以下列表:
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。有人可以帮我解决这个问题吗?
谢谢
编辑:我纠正了指数
这是一个纯粹的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)
您可以使用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+')
然后,使用groupby
和unstack
:
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