Итерация по нескольким строкам данных одновременно - PullRequest
0 голосов
/ 27 марта 2020

У меня есть 16 разных фреймов данных с одинаковым количеством строк / столбцов и еще 2 отдельных фрейма данных с той же формой, которые я использую для сравнения с 16 значениями фрейма данных.

Мне нужно l oop по всем фреймам данных одновременно, сравнить все значения строк с отдельными фреймами данных, а затем создать еще один фрейм данных с результатами, подобными следующим:

сравнение: sum(row_values_of_dataframe) - sum(row_values_of_reference). В приведенном ниже примере ячейка df_a_ref_a равна (1 + 2 + 3 + 4) - (5 + 5 + 5 + 5) = -10

Dataframe A (df_a)

col1 | col 2 | col 3 | col 4
1       2       3       4
2       4       6       8
[...]

Dataframe B (df_b)

col1 | col 2 | col 3 | col 4
10      5       2       1
4       4       6       2
[...]

Reference Dataframe 1 (ref_1)
col1 | col 2 | col 3 | col 4
5       5       5       5
5       5       5       5
[...]

Reference Dataframe 2 (ref_2)
col1 | col 2 | col 3 | col 4
3       3       3       3
3       3       3       3
[...]

Конечный кадр данных должен быть:

df_a_ref_1 | df_a_ref_2 | df_b_ref_1 | df_b_ref_2 | ....
    -10          -2           -2           6        ....
     0           8            -4           4
[...]

Это поведение напоминает zip() функцию в python.

Заранее спасибо,

Ответы [ 3 ]

1 голос
/ 27 марта 2020

Yo может хранить ваши фреймы данных в двух разных списках, а затем перебирать их, добавляя новый столбец для каждого фрейма данных.

Вот пример с 2-мя данными (вам нужно только добавить остальные 14).

list_dataframes = [df, df2]
list_dataframes_references = [df_reference, df_reference2]
list_names = ["a", "b"]

final_df = pd.DataFrame()

for i in range(len(list_dataframes)):
    a_sum = list_dataframes[i].sum(axis=1)
    a_ref_sum = list_dataframes_references[i].sum(axis=1)

    final_df.loc[:, "columna_{}".format(list_names[i])] = a_sum - a_ref_sum

Здесь вы избегаете итерации внутри фреймов данных с использованием векторизации (как сказал пользователь @bug_spray ), который является более эффективным и чистым.

0 голосов
/ 27 марта 2020

Используйте векторизацию.

A = pd.DataFrame([[1,2,3,4],[2,4,6,8]])
B = pd.DataFrame([[10,5,2,1],[4,4,6,2]])
# ...

dfs = [A, B, ...]

ref_a1 = (A - 5).sum(1)
ref_a2 = (A - 3).sum(1)
ref_b1 = (B - 5).sum(1)
ref_b2 = (B - 3).sum(1)

Поместите это в al oop, если хотите ...

dfs = [A,B,...]
result_names = ['df_a_ref_1', 'df_a_ref_2', 'df_b_ref_1', ...]

res = []
for df in dfs:
    res += [(df-5).sum(1)]
    res += [(df-3).sum(1)]

results = pd.DataFrame(res, columns=result_names)

0 голосов
/ 27 марта 2020

Я не понимаю точных имен, которые вы дали своим фреймам данных, но вот как вы можете добиться этого:

new_df = pd.DataFrame()
for df, ref in #loop over dfs and refs:
    new_df[#column name] = df.to_numpy().sum(1) - ref.to_numpy().sum(1)

Если у вас есть список dfs и refs, вы можете сделать for df, ref in zip(dfs, refs)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...