迭代 Pandas Dataframe 中的列和行

Posted

技术标签:

【中文标题】迭代 Pandas Dataframe 中的列和行【英文标题】:Iteration over columns and rows in Pandas Dataframe 【发布时间】: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) 【参考方案1】:

你也可以通过这种方式达到你想要的结果:

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...option N 是二进制的,因为本质上此解决方案是将option1...option N 中的每个二进制值与views 中的值相乘。

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

4) 此解决方案假定存在标记为 views 的列。

【讨论】:

【参考方案2】:

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

## 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

【讨论】:

【参考方案3】:
dataSet = pd.read_excel("dataset.xlsx")
i = 0 ;
for column in dataSet:
    for i in dataSet[column].iteritems():
        if (column == 'views'):
            print (i)

【讨论】:

欢迎来到 Stack Overflow!感谢您提供代码 sn-p,它可能会提供一些有限的即时帮助。通过描述为什么这是解决问题的好方法,正确的解释将极大地改进其long-term value,并使其对有其他类似问题的未来读者更有用。请编辑您的答案以添加一些解释,包括您所做的假设。【参考方案4】:

我认为这可行:

df=df.astype(int)
df[df.columns[:-1]]= np.where(df[df.columns[:-1]]>0, 1, 0)
df[df.columns[:-1]]= df[df.columns[:-1]].mul(df['views'].as_matrix(), axis=0)

【讨论】:

如果你的数据框是二进制的,你不必使用:df[df.columns[:-1]]= np.where(df[df.columns[:-1]]>0 , 1, 0)

以上是关于迭代 Pandas Dataframe 中的列和行的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Pandas DataFrame 的列和行子集转换为 numpy 数组?

Pandas列表的列,通过迭代(选择)三列的每个列表元素作为新列和行来创建多列[重复]

遍历 pandas 数据框中的列和行并将字符串转换为浮点数

用 Pandas 将 DataFrame 中某些列和行的值替换为同一 DataFrame 中另一列的值

Pandas 系列 - 打印列和行

列和行索引高于 SKTileMapNode 中的列和行数