pandas.DataFrame的for循环迭代如何实现

其他教程   发布日期:2023年06月26日   浏览次数:399

本篇内容主要讲解“pandas.DataFrame的for循环迭代如何实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“pandas.DataFrame的for循环迭代如何实现”吧!

    当使用for语句循环(迭代)pandas.DataFrame时,简单的使用for语句便可以取得返回列名,因此使用重复使用for方法,便可以获取每行的值。

    以下面的pandas.DataFrame为例。

    1. import pandas as pd
    2. df = pd.DataFrame({'age': [24, 42], 'state': ['NY', 'CA'], 'point': [64, 92]},
    3. index=['Alice', 'Bob'])
    4. print(df)
    5. # age state point
    6. # Alice 24 NY 64
    7. # Bob 42 CA 92

    在此对以下内容进行说明:

    • pandas.DataFrame for循环的应用

    • 逐列检索

      • DataFrame.iteritems()

    • 逐行检索

      • DataFrame.iterrows()

      • DataFrame.itertuples()

    • 检索特定列的值

    • 循环更新值

    pandas.DataFrame for循环的应用

    当pandas.DataFrame直接使用for循环时,按以下顺序获取列名(列名)。

    1. for column_name in df:
    2. print(type(column_name))
    3. print(column_name)
    4. print('======
    5. ')
    6. # <class 'str'>
    7. # age
    8. # ======
    9. #
    10. # <class 'str'>
    11. # state
    12. # ======
    13. #
    14. # <class 'str'>
    15. # point
    16. # ======
    17. #

    调用方法__iter __()。

    1. for column_name in df.__iter__():
    2. print(type(column_name))
    3. print(column_name)
    4. print('======
    5. ')
    6. # <class 'str'>
    7. # age
    8. # ======
    9. #
    10. # <class 'str'>
    11. # state
    12. # ======
    13. #
    14. # <class 'str'>
    15. # point
    16. # ======
    17. #

    逐列检索

    DataFrame.iteritems()

    使用iteritems()方法,您可以一一获取列名称(列名称)和元组(列名称,系列)的每个列的数据(pandas.Series类型)。

    pandas.Series可以通过指定索引名称等来检索行的值。

    1. for column_name, item in df.iteritems():
    2. print(type(column_name))
    3. print(column_name)
    4. print('~~~~~~')
    5. print(type(item))
    6. print(item)
    7. print('------')
    8. print(item['Alice'])
    9. print(item[0])
    10. print(item.Alice)
    11. print('======
    12. ')
    13. # <class 'str'>
    14. # age
    15. # ~~~~~~
    16. # <class 'pandas.core.series.Series'>
    17. # Alice 24
    18. # Bob 42
    19. # Name: age, dtype: int64
    20. # ------
    21. # 24
    22. # 24
    23. # 24
    24. # ======
    25. #
    26. # <class 'str'>
    27. # state
    28. # ~~~~~~
    29. # <class 'pandas.core.series.Series'>
    30. # Alice NY
    31. # Bob CA
    32. # Name: state, dtype: object
    33. # ------
    34. # NY
    35. # NY
    36. # NY
    37. # ======
    38. #
    39. # <class 'str'>
    40. # point
    41. # ~~~~~~
    42. # <class 'pandas.core.series.Series'>
    43. # Alice 64
    44. # Bob 92
    45. # Name: point, dtype: int64
    46. # ------
    47. # 64
    48. # 64
    49. # 64
    50. # ======
    51. #

    逐行检索

    一次检索一行的方法包括iterrows()和itertuples()。 itertuples()更快。

    如果只需要特定列的值,则如下所述,指定列并将它们分别在for循环中进行迭代会更快。

    DataFrame.iterrows()

    通过使用iterrows()方法,可以获得每一行的数据(pandas.Series类型)和行名和元组(索引,系列)。

    pandas.Series可以通过指定列名等来检索列的值。

    1. for index, row in df.iterrows():
    2. print(type(index))
    3. print(index)
    4. print('~~~~~~')
    5. print(type(row))
    6. print(row)
    7. print('------')
    8. print(row['point'])
    9. print(row[2])
    10. print(row.point)
    11. print('======
    12. ')
    13. # <class 'str'>
    14. # Alice
    15. # ~~~~~~
    16. # <class 'pandas.core.series.Series'>
    17. # age 24
    18. # state NY
    19. # point 64
    20. # Name: Alice, dtype: object
    21. # ------
    22. # 64
    23. # 64
    24. # 64
    25. # ======
    26. #
    27. # <class 'str'>
    28. # Bob
    29. # ~~~~~~
    30. # <class 'pandas.core.series.Series'>
    31. # age 42
    32. # state CA
    33. # point 92
    34. # Name: Bob, dtype: object
    35. # ------
    36. # 92
    37. # 92
    38. # 92
    39. # ======

    DataFrame.itertuples()

    使用itertuples()方法,可以一一获取索引名(行名)和该行数据的元组。元组的第一个元素是索引名称。

    默认情况下,返回一个名为Pandas的namedtuple。由于它是namedtuple,因此可以访问每个元素的值。

    1. for row in df.itertuples():
    2. print(type(row))
    3. print(row)
    4. print('------')
    5. print(row[3])
    6. print(row.point)
    7. print('======
    8. ')
    9. # <class 'pandas.core.frame.Pandas'>
    10. # Pandas(Index='Alice', age=24, state='NY', point=64)
    11. # ------
    12. # 64
    13. # 64
    14. # ======
    15. #
    16. # <class 'pandas.core.frame.Pandas'>
    17. # Pandas(Index='Bob', age=42, state='CA', point=92)
    18. # ------
    19. # 92
    20. # 92
    21. # ======
    22. #

    如果参数name为None,则返回一个普通的元组。

    1. for row in df.itertuples(name=None):
    2. print(type(row))
    3. print(row)
    4. print('------')
    5. print(row[3])
    6. print('======
    7. ')
    8. # <class 'tuple'>
    9. # ('Alice', 24, 'NY', 64)
    10. # ------
    11. # 64
    12. # ======
    13. #
    14. # <class 'tuple'>
    15. # ('Bob', 42, 'CA', 92)
    16. # ------
    17. # 92
    18. # ======

    检索特定列的值

    上述的iterrows()和itertuples()方法可以检索每一行中的所有列元素,但是如果仅需要特定的列元素,可以使用以下方法。

    pandas.DataFrame的列是pandas.Series。

    1. print(df['age'])
    2. # Alice 24
    3. # Bob 42
    4. # Name: age, dtype: int64
    5. print(type(df['age']))
    6. # <class 'pandas.core.series.Series'>

    如果将pandas.Series应用于for循环,则可以按顺序获取值,因此,如果指定pandas.DataFrame列并将其应用于for循环,则可以按顺序获取该列中的值。

    1. for age in df['age']:
    2. print(age)
    3. # 24
    4. # 42

    如果使用内置函数zip(),则可以一次收集多列值。

    1. for age, point in zip(df['age'], df['point']):
    2. print(age, point)
    3. # 24 64
    4. # 42 92

    如果要获取索引(行名),使用index属性。如以上示例所示,可以与其他列一起通过zip()获得。

    1. print(df.index)
    2. # Index(['Alice', 'Bob'], dtype='object')
    3. print(type(df.index))
    4. # <class 'pandas.core.indexes.base.Index'>
    5. for index in df.index:
    6. print(index)
    7. # Alice
    8. # Bob
    9. for index, state in zip(df.index, df['state']):
    10. print(index, state)
    11. # Alice NY
    12. # Bob CA

    循环更新值

    iterrows()方法逐行检索值,返回一个副本,而不是视图,因此更改pandas.Series不会更新原始数据。

    1. for index, row in df.iterrows():
    2. row['point'] += row['age']
    3. print(df)
    4. # age state point
    5. # Alice 24 NY 64
    6. # Bob 42 CA 92

    at[]选择并处理原始DataFrame中的数据时更新。

    1. for index, row in df.iterrows():
    2. df.at[index, 'point'] += row['age']
    3. print(df)
    4. # age state point
    5. # Alice 24 NY 88
    6. # Bob 42 CA 134

    有关at[]的文章另请参考以下连接。

    Pandas获取和修改任意位置的值(at,iat,loc,iloc)

    请注意,上面的示例使用at[]只是一个示例,在许多情况下,有必要使用for循环来更新元素或基于现有列添加新列,for循环的编写更加简单快捷。

    与上述相同的处理。上面更新的对象被进一步更新。

    1. df['point'] += df['age']
    2. print(df)
    3. # age state point
    4. # Alice 24 NY 112
    5. # Bob 42 CA 176

    可以添加新列。

    1. df['new'] = df['point'] + df['age'] * 2
    2. print(df)
    3. # age state point new
    4. # Alice 24 NY 112 160
    5. # Bob 42 CA 176 260

    除了简单的算术运算之外,NumPy函数还可以应用于列的每个元素。以下是平方根的示例。另外,这里,NumPy的功能可以通过pd.np访问,但是,当然可以单独导入NumPy。

    1. df['age_sqrt'] = pd.np.sqrt(df['age'])
    2. print(df)
    3. # age state point new age_sqrt
    4. # Alice 24 NY 112 160 4.898979
    5. # Bob 42 CA 176 260 6.480741

    对于字符串,提供了用于直接处理列(系列)的字符串方法。下面是转换为小写并提取第一个字符的示例。

    1. df['state_0'] = df['state'].str.lower().str[0]
    2. print(df)
    3. # age state point new age_sqrt state_0
    4. # Alice 24 NY 112 160 4.898979 n
    5. # Bob 42 CA 176 260 6.480741 c

    以上就是pandas.DataFrame的for循环迭代如何实现的详细内容,更多关于pandas.DataFrame的for循环迭代如何实现的资料请关注九品源码其它相关文章!