Python 数据帧中的循环、iloc和loc?
嘿,伙计们,我是python新手,现在我开始使用一些库,比如Pandas和Numpy。最近,我的老师给了我这个练习,我不知道该用哪种方法。详情如下:Python 数据帧中的循环、iloc和loc?,python,python-3.x,pandas,dataframe,Python,Python 3.x,Pandas,Dataframe,嘿,伙计们,我是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],
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列1-5列:随机数
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:很抱歉我的英语不好,但我真的不知道如何用英语解释这个练习,我只是尽我所能:使用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
性能:
使用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
性能:
为此,可以使用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
编辑以完成答案…您可以为此使用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
编辑以完成答案…使用索引在序列上循环,然后使用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
使用索引循环序列,然后使用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
非常感谢,我不知道在这种情况下我们可以使用numpy。我确实读了一些文件,他们说numpy比熊猫更好地处理大型数据集,可能只是更快而已。但是我想我必须编写和阅读更多的代码才能使用这两个库。非常感谢,我不知道在这种情况下我们可以使用numpy。我确实读了一些文件,他们说numpy比熊猫更好地处理大型数据集,可能只是更快而已。但是我认为我必须编写更多的代码并阅读更多的内容才能使用这两个库。谢谢你的回答,先生,我不得不承认我尝试过这种方法,但我不知道如何处理for循环的其余部分。我理解第二行,但不知道如何申请全部:这很容易。只需将val附加到列表中,然后将其作为新列添加到df中。请看我上面的编辑…谢谢你的回答,先生,我不得不承认我尝试过这种方法,但我不知道如何处理for循环的其余部分。我理解第二行,但不知道如何申请全部:这很容易。只需将val附加到列表中,然后将其作为新列添加到df中。见我的编辑上面。。。