迭代 Pandas Dataframe 中的列和行

新手上路,请多包涵

假设我有一个如下所示的数据框:

 d = {'option1': ['1', '0', '1', '1'], 'option2': ['0', '0', '1', '0'], 'option3': ['1', '1', '0', '0'], 'views': ['6', '10', '5', '2']
df = pd.DataFrame(data=d)

print(df)

  option1 option2 option3 views
0       1       0       1     6
1       0       0       1    10
2       1       1       0     5
3       1       0       0     2

我正在尝试构建一个循环遍历每一列(“视图”列除外)和每一行的循环。如果单元格的值不为 0,我想将其替换为同一行中“views”列的相应值。

需要以下输出(应该更容易理解):

   option1 option2 option3 views
0       6       0       6     6
1       0       0      10    10
2       5       5       0     5
3       2       0       0     2

我试过类似的东西:

 df_range = len(df)

for column in df:
    for i in range(df_range):
        if column != 0:
            column = df.views[i]

但我知道我遗漏了一些东西,它不起作用。

另外请注意,在我的真实数据框中,我有几十列,所以我需要一些东西来自动迭代每一列。谢谢!!

我看到这个线程 Update a dataframe in pandas while iterateing row by row 但它并不完全适用于我的问题,因为我不仅要逐行,我还需要逐列。

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

阅读 405
2 个回答

您也可以通过这种方式实现您想要的结果:

 for col in df:
    if col == 'views':
        continue
    for i, row_value in df[col].iteritems():
        df[col][i] = row_value * df['views'][i]

请注意有关此解决方案的以下内容:

  1. 此解决方案单独对数据帧中的每个值进行操作,因此效率低于广播,因为它执行两个循环(一个外部循环,一个内部循环)。

  2. 此解决方案假设 option1 …选项 N 是二进制的,因为基本上此解决方案是将 option1 …选项 N 中的每个二进制值与 —ca03e5892834987a1673630 中的值 views

  3. 此解决方案适用于任意数量的选项列。选项列可以有任何你想要的标签。

  4. 此解决方案假定有一列标记为 views

原文由 Keith Dowd 发布,翻译遵循 CC BY-SA 3.0 许可协议

您不需要遍历行。这个应该更快:确保列值是整数。

 ## convert column type to integer
for i in df:
    df[i] = df[i].astype(int)

## update columns
for col in df:
    if col != 'views':
        df[col] = df[col] * df['views']

df

    option1     option2     option3     views
0      6          0            6          6
1      0          0           10         10
2      5          5            0          5
3      2          0            0          2

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

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