通过zip遍历DataFrame

时间:2019-01-29 17:45:41

标签: python python-3.x

我正在使用以下代码遍历数据帧:

for r in zip(df['Name']):
   #statements

如何识别数据框中的特定行?例如,我想在遍历时为“名称”列的每一行分配一个新值。我怎么做? 我已经尝试过了:

for r in zip(df['Name']):
   df['Name']= time.time()

问题在于,每一行都将获得相同的值,而不是不同的值。

2 个答案:

答案 0 :(得分:0)

主要问题在于作业:

df['Name']= time.time()

这表示获取当前时间并将其分配给Name列中的每个单元格。您引用列向量,而不是特定的行。注意您的迭代语句:

for r in zip(df['Name']):

在此,r是该行,但是您从不引用它。这样一来,您在循环中所做的任何事情就极不可能影响单个行。


戴上我的“老师”帽子...

查找有关如何遍历Pandas数据框的行的示例。

在其中,查看如何引用单个单元格:该技术看起来很像为嵌套列表编制索引。

现在,更改代码,以便一次将当前时间放入一个一个单元格,每次迭代一次。看起来像

df.at[row]['Name'] = time.time()

row['Name'] = time.time()

取决于您在迭代中如何定义row

这会让您找到解决方案吗?

答案 1 :(得分:0)

以下内容也适用:

import pandas as pd
import time

# example df
df = pd.DataFrame(data={'name': ['Bob', 'Dylan', 'Rachel', 'Mark'],
                        'age': [23, 27, 30, 35]})

# iterate through each row in the data frame
col_idx = df.columns.get_loc('name') # this is so we can use iloc

for i in df.itertuples():
    df.iloc[i[0], col_idx] = time.time()

因此,从本质上讲,我们使用数据帧的索引作为行位置的指标。第一个索引指向数据框中的第一行,依此类推。

编辑:如注释中所述,使用.index来迭代行不是一个好习惯。因此,让我们使用数据框本身的行数。可以通过df.shape返回一个元组(row, column)来获得,因此,我们只需要行df.shape[0]

第二次编辑:使用df.itertuples()获取性能,使用.iloc获取基于整数的索引。

此外,由于潜在的pandas,官方loc文档建议使用pandas来将变量分配给chained indexing数据帧。更多信息,请点击http://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy