【发布时间】:2018-08-03 16:45:48
【问题描述】:
假设我有一个看起来像这样的数据框:
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 iterating row by row,但它并不完全适用于我的问题,因为我不仅要逐行进行,还需要逐列进行。
【问题讨论】:
-
尝试使用 iterrows
-
使用 iterrows 对行有效,但我也在尝试遍历列。这就是为什么我的问题与作为答案的其他线程不完全相同的原因......
-
我会重新打开它,仔细看看它的愚蠢之处。
-
当您使用
for column in df迭代DataFrame 时,您的列变量将是列名。column != 0:不会因此而工作。如果您尝试访问该特定单元格,则需要检查df[column].iloc[i] !=0。但要知道这是非常低效的。 -
这是一个有代表性的例子吗?如果是这样,我只需将选项列与视图列相乘:
df.loc[:, 'option1':'option3'].mul(df['views'], axis=0)您可以以相同的方式将其分配回来df.loc[:, 'option1':'option3']. = df.loc[:, 'option1':'option3'].mul(df['views'], axis=0)
标签: python pandas for-loop dataframe