如何遍历熊猫中的数据框列表?

时间:2020-08-06 13:06:39

标签: python pandas

我有以下数据框,组合成一个列表:

df = pd.DataFrame({'numbers': [1, 2, 3], 'colors': ['red', 'white', 'blue']})
df1 = pd.DataFrame({'numbers': [7, 44, 93], 'colors': ['red', 'white', 'blue']})

df_list = [df,df1]

我想使用一个for循环,遍历它们,并打印每个数字。 为此,我尝试了:

for num in df_list.numbers.unique():
    val = locals()[num]
    print(val)

但是出现错误:

AttributeError: 'list' object has no attribute 'numbers'

我也尝试过,更简单:

for num in df_list.numbers.unique():
    print(num)

但是出现错误:

AttributeError: 'list' object has no attribute 'numbers'

问了类似的问题,但没有令人满意的答复。

2 个答案:

答案 0 :(得分:3)

选项A:遍历数据帧列表中的值

由于有两个数据框,因此必须

  • 一个接一个地遍历数据帧
  • 然后,对于每个数据帧(df_tmp),迭代所有唯一数字
In [1]: import pandas as pd

In [2]: df = pd.DataFrame({'numbers': [1, 2, 3], 'colors': ['red', 'white', 'blue']})
   ...: df1 = pd.DataFrame({'numbers': [7, 44, 93], 'colors': ['red', 'white', 'blue']})

In [3]: df_list = [df,df1]

In [4]: for df_tmp in df_list:
   ...:     for num in df_tmp['numbers'].unique():
   ...:         print(num)
   ...:
1
2
3
7
44
93

注意:使用这种方法,这些值不一定是唯一的!(例如,如果您两个人都2df['numbers']df1['numbers'],它将被打印两次)。

选项B:在迭代之前合并数据帧

有时,创建另一个将所有数据框组合在一起的数据框可能会更有用。您可以使用pd.concat 1 来做到这一点:

In [17]: df_new = pd.concat(df_list)

In [18]: df_new
Out[18]:
   numbers colors
0        1    red
1        2  white
2        3   blue
0        7    red
1       44  white
2       93   blue

然后,您可以通过以下简单操作来遍历'numbers'中的所有唯一元素:

In [19]: for num in df_new['numbers'].unique():
    ...:     print(num)
    ...:
1
2
3
7
44
93
  • 这将确保数字为唯一。不利的一面是,如果您需要做的就是迭代存在于多个数据框中的列的唯一元素,那么创建一个新的数据框会有些开销。这将成为选项C。

选项C:仅遍历唯一值

  • 如果您要做的只是遍历存在于多个数据框中的一列中的唯一元素,则不需要为此使用临时数据框。取而代之的是,您只需合并元素集即可实现相同的目的
# or: nums = set().union(*(map(lambda x:set(x['numbers']), (df, df1))))
In [30]: nums = set().union(*(set(df_['numbers']) for df_ in (df, df1)))

In [31]: nums
Out[31]: {1, 2, 3, 7, 44, 93}

In [32]: for num in nums:
    ...:     print(num)
    ...:
1
2
3
7
44
93


1 pd.concat()以一个可迭代(例如,列表,元组或生成器)作为第一个参数,并返回一个可以使用的全新数据框。

答案 1 :(得分:2)

您正在尝试遍历列表。列表项是dfs而不是数字。 您应该连接dfs:

dfs_list=pd.concat(df_list)

dfs_list喜欢这样:

    numbers colors
  0  1      red
  1  2      white
  2  3      blue
  0  7      red
  1  44    white
  2  93     blue

现在循环将起作用:

for num in dfs_list.numbers.unique():
print(num)
1
2
3
7
etc...