Как пройти по списку фреймов данных в Pandas? - PullRequest
0 голосов
/ 06 августа 2020

У меня есть следующие фреймы данных, объединенные в список:

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]

Я хотел бы использовать a для l oop, чтобы перебирать их и печатать каждое число. Для этого я пробовал:

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 ]

3 голосов
/ 06 августа 2020

Вариант 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

Примечание : при таком подходе значения не обязательно будут быть уникальным! (например, если у вас есть 2 в обоих, df['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() принимает итерацию (например, , список, кортеж или генератор) в качестве первого аргумента и возвращает новый фрейм данных, который вы можете использовать.

2 голосов
/ 06 августа 2020

вы пытаетесь перебрать список. элементы списка являются dfs, а не числами. вы должны объединить dfs:

dfs_list=pd.concat(df_list)

dfs_list lokks следующим образом:

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

и теперь l oop будет работать:

for num in dfs_list.numbers.unique():
print(num)
1
2
3
7
etc...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...