Pandas Dataframe 中的列和行的迭代

Not*_*tna 8 python for-loop dataframe pandas

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

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
Run Code Online (Sandbox Code Playgroud)

我正在尝试构建一个 for 循环,迭代每一列(“视图”列除外)和每一行。如果单元格的值不为 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
Run Code Online (Sandbox Code Playgroud)

我尝试过类似的东西:

df_range = len(df)

for column in df:
    for i in range(df_range):
        if column != 0:
            column = df.views[i]
Run Code Online (Sandbox Code Playgroud)

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

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

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

Kei*_*owd 7

您还可以通过以下方式达到您想要的结果:

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

请注意有关此解决方案的以下几点:

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

2) 该解决方案假设option1...选项 N 是二进制的,因为本质上该解决方案是将 ...选项 N 中的每个二进制值option1与 中的值相乘views

3) 该解决方案适用于任意数量的选项列。选项列可能有您想要的任何标签。

4) 该解决方案假设有一列标记为views