大家好,我是python的新手,现在我开始使用某些库,例如Pandas和Numpy。最近,我的老师给了我这个练习,我不知道应该使用哪种方法。详细信息如下所示:
df1 = pd.DataFrame({'col1': [0, 1, 1, 0, 3],
'col2': [23, 4, 1, 1, 3],
'col3': [0, 5, 2, 1, 1],
'col4': [1, 2, 6, 4, 0],
'col5': [4, 15, 0, 2, 5],
'loc': [1, 4, 2, 3, 2]})
1)col1-col5:随机数
2)loc:值的位置。
3)计算返回每个列的值的“ val”,位置在“ loc”中给出。
示例:在第0行中,loc = 1,val =23。在第1行中,loc = 4,val = 15,依此类推。
结果应该是这样的:
df = pd.DataFrame({'col1': [0, 1, 1, 0, 3],
'col2': [23, 4, 1, 1, 3],
'col3': [0, 5, 2, 1, 1],
'col4': [1, 2, 6, 4, 0],
'col5': [4, 15, 0, 2, 5],
'loc': [1, 4, 2, 3, 2],
'val': [23, 15, 2, 4, 1]})
我已经尝试过像iloc和loc这样的东西来计算'val'。但是,当数据帧变大时,我将无法再使用此方法。有没有更快的方法来计算“ val”?我需要使用循环来计算“ val”吗?
df1 = df['loc']
df.iloc[0,df1[0]]
df.iloc[1,df1[1]]
df.iloc[2,df1[2]]
PS:对不起,我的英语不好,但是我真的不知道该如何用英语来解释这个练习,我只是尽力而为:(
答案 0 :(得分:1)
使用numpy索引,尤其是在性能很重要的情况下:
df1['value'] = df1.values[np.arange(len(df1)), df1['loc']]
print (df1)
col1 col2 col3 col4 col5 loc value
0 0 23 0 1 4 1 23
1 1 4 5 2 15 4 15
2 1 1 2 6 0 2 2
3 0 1 1 4 2 3 4
4 3 3 1 0 5 2 1
性能:
#5000 rows
df1 = pd.concat([df1] * 1000, ignore_index=True)
In [73]: %timeit df1['value'] = df1.values[np.arange(len(df1)), df1['loc']]
266 µs ± 8.06 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
In [74]: %%timeit
...: result = []
...: for index, row in df1['loc'].iteritems():
...: result.append(df1.iat[index, row])
...: df1['val'] = result
...:
64 ms ± 753 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
In [75]: %timeit df1['value'] = df1.apply(lambda x: x.iloc[x['loc']], axis = 1)
243 ms ± 11.9 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
答案 1 :(得分:1)
您可以为此使用for循环,在其中将值增加到列“ loc”的长度范围内(例如)。使用.iloc
,您可以从“ loc”列中选择正确的行和值。
我不会为您提供完整的解决方案,而是遵循以下原则:
vals = [] # Create an empty list to hold the requested values
for i in range(len(df['loc'])): # Loop over the rows ('i')
val = df.iloc[i, df['loc'][i]] # Get the requested value from row 'i'
vals.append(val) # append value to list 'vals'
df['value'] = vals # Add list 'vals' as a new column to the DataFrame
已编辑以完成答案...
答案 2 :(得分:1)
使用索引遍历该系列,然后使用pd.iat [row int pos,column int pos],您将获得准确的值,可以从值数组中创建新的系列。
result = []
for index, row in df1['loc'].iteritems():
result.append(df1.iat[index, row])
df1['val'] = result