逐个循环数据帧(pandas)

Bon*_*aux 3 python loops dataframe pandas

假设我们有一个包含A,B和C列的数据框:

df = pd.DataFrame(columns =('A','B','C'), index=range(1))
Run Code Online (Sandbox Code Playgroud)

列包含三行数值:

0     A     B      C
1    2.1   1.8    1.6
2    2.01  1.81   1.58
3    1.9   1.84   1.52
Run Code Online (Sandbox Code Playgroud)

如何循环遍历从1到3的每一行,然后执行if语句,包括添加一些变量:

if B1 > 1.5
    calc_temp   = A1*10
    calc_temp01 = C1*-10
if B2 > 1.5 
    calc_temp   = A2*10
    calc_temp01 = C2*-10
if B3 >1.5
    calc_temp   = A3*10
    calc_temp01 = C3*-10
Run Code Online (Sandbox Code Playgroud)

甚至可能吗?它必须知道一系列的种类,即带有某种计数器的全范围数据集号,是吗?if语句应该引用该特定行.

jez*_*ael 10

我想你需要iterrows:

for i, row in df.iterrows():
    if row['B'] > 1.5:
        calc_temp   = row['A'] *10
        calc_temp01 = row['C'] *-10
Run Code Online (Sandbox Code Playgroud)

  • 如果您在循环中访问该行,为什么要再次调用`.loc`?也可以使用`for i in range(len(df)):` (2认同)

Rom*_*ron 9

如何高效迭代

如果您确实必须迭代 Pandas 数据框,您可能希望避免使用 iterrows()。有不同的方法,通常的方法iterrows()远不是最好的。itertuples() 可以快 100 倍。

简而言之:

  • 作为一般规则,使用df.itertuples(name=None). 特别是当您的列数固定且少于 255 列时。见第(3)点
  • 否则,df.itertuples()如果您的列包含空格或“-”等特殊字符,请使用 except。见第(2)点
  • itertuples()即使您的数据框具有奇怪的列,也可以通过使用最后一个示例来使用。见第(4)点
  • iterrows()当您无法使用以前的解决方案时才使用。见第(1)点

迭代 Pandas 数据框中的行的不同方法:

生成一个包含 100 万行 4 列的随机数据帧:

    df = pd.DataFrame(np.random.randint(0, 100, size=(1000000, 4)), columns=list('ABCD'))
    print(df)
Run Code Online (Sandbox Code Playgroud)

1)通常iterrows()很方便,但是慢得要死:

start_time = time.clock()
result = 0
for _, row in df.iterrows():
    result += max(row['B'], row['C'])

total_elapsed_time = round(time.clock() - start_time, 2)
print("1. Iterrows done in {} seconds, result = {}".format(total_elapsed_time, result))
Run Code Online (Sandbox Code Playgroud)

2) 默认值itertuples()已经快得多,但它不适用于以下列名My Col-Name is very Strange(如果列重复或列名不能简单地转换为 Python 变量名,则应避免使用此方法):

start_time = time.clock()
result = 0
for row in df.itertuples(index=False):
    result += max(row.B, row.C)

total_elapsed_time = round(time.clock() - start_time, 2)
print("2. Named Itertuples done in {} seconds, result = {}".format(total_elapsed_time, result))
Run Code Online (Sandbox Code Playgroud)

3)默认itertuples()使用 name=None 更快,但不太方便,因为您必须为每列定义一个变量。

start_time = time.clock()
result = 0
for(_, col1, col2, col3, col4) in df.itertuples(name=None):
    result += max(col2, col3)

total_elapsed_time = round(time.clock() - start_time, 2)
print("3. Itertuples done in {} seconds, result = {}".format(total_elapsed_time, result))
Run Code Online (Sandbox Code Playgroud)

4)最后,命名itertuples()比前一点慢,但您不必为每列定义一个变量,并且它可以与列名称一起使用,例如My Col-Name is very Strange.

start_time = time.clock()
result = 0
for row in df.itertuples(index=False):
    result += max(row[df.columns.get_loc('B')], row[df.columns.get_loc('C')])

total_elapsed_time = round(time.clock() - start_time, 2)
print("4. Polyvalent Itertuples working even with special characters in the column name done in {} seconds, result = {}".format(total_elapsed_time, result))
Run Code Online (Sandbox Code Playgroud)

输出:

         A   B   C   D
0       41  63  42  23
1       54   9  24  65
2       15  34  10   9
3       39  94  82  97
4        4  88  79  54
...     ..  ..  ..  ..
999995  48  27   4  25
999996  16  51  34  28
999997   1  39  61  14
999998  66  51  27  70
999999  51  53  47  99

[1000000 rows x 4 columns]

1. Iterrows done in 104.96 seconds, result = 66151519
2. Named Itertuples done in 1.26 seconds, result = 66151519
3. Itertuples done in 0.94 seconds, result = 66151519
4. Polyvalent Itertuples working even with special characters in the column name done in 2.94 seconds, result = 66151519
Run Code Online (Sandbox Code Playgroud)

这篇文章是 iterrows 和 itertuples 之间非常有趣的比较