我有以下数据框,组合成一个列表:
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'
问了类似的问题,但没有令人满意的答复。
答案 0 :(得分:3)
由于有两个数据框,因此必须
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
注意:使用这种方法,这些值不一定是唯一的!(例如,如果您两个人都2
,df['numbers']
和df1['numbers']
,它将被打印两次)。
有时,创建另一个将所有数据框组合在一起的数据框可能会更有用。您可以使用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
# 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...