Dataframe 中的 Loop、iloc 和 loc?

新手上路,请多包涵

大家好,我是 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:对不起我的英语不好,但我真的不知道如何用英语解释这个练习,我只是尽力而为:(

原文由 Long_NgV 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1k
2 个回答

使用 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)

原文由 jezrael 发布,翻译遵循 CC BY-SA 4.0 许可协议

您可以为此使用 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

编辑以完成答案…

原文由 Niels Henkens 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏