Извлечение строк из фрейма данных относительно значения бина из другого фрейма данных (без использования имен столбцов) - PullRequest
0 голосов
/ 29 октября 2018

Я работаю с 3 фреймами данных, из которых 2 фрейма данных содержат дополнительный номер ячейки, назначенный данным столбца на основе диапазона, к которому они принадлежат (в отдельных столбцах).

df_1

A & ЕПРС; & ЕПРС; B

5 & ЕПРС; & ЕПРС; 6

8 & ЕПРС; & ЕПРС; 1

6 & ЕПРС; & ЕПРС; 7

4 & ЕПРС; & ЕПРС; 9

1 & ЕПРС; & ЕПРС; 3

9 & ЕПРС; & ЕПРС; 2

2 & ЕПРС; & ЕПРС; 5

df_2

* 1 022 * А & ЕПРС; & ЕПРС; B & ЕПРС; & ЕПРС; A_bin & ЕПРС; & ЕПРС; B_bin

5 & ЕПРС; & ЕПРС; 6 & ЕПРС; & ЕПРС; 2 & ЕПРС; & ЕПРС; & ЕПРС; & ЕПРС; 2

8 & ЕПРС; & ЕПРС; 1 & ЕПРС; & ЕПРС; 1 & ЕПРС; & ЕПРС; & ЕПРС; & ЕПРС; 1

* 6 * тысяча двадцать восемь & ЕПРС; & ЕПРС; 7 & ЕПРС; & ЕПРС; 3 & ЕПРС; & ЕПРС; & ЕПРС; & ЕПРС; 2

4 & ЕПРС; & ЕПРС; 9 & ЕПРС; & ЕПРС; 3 & ЕПРС; & ЕПРС; & ЕПРС; & ЕПРС; 3

* +1032 * 1 & ЕПРС; & ЕПРС; 3 & ЕПРС; & ЕПРС; 1 & ЕПРС; & ЕПРС; & ЕПРС; & ЕПРС; 1 * 1 034 * 9 & ЕПРС; & ЕПРС; 2 & ЕПРС; & ЕПРС; 1 & ЕПРС; & ЕПРС; & ЕПРС; & ЕПРС; 1 * +1036 * 2 & ЕПРС; & ЕПРС; 5 & ​​ЕПРС; & ЕПРС; 2 & ЕПРС; & ЕПРС; & ЕПРС; & ЕПРС; 2

df_3

A & ЕПРС; & ЕПРС; B & ЕПРС; & ЕПРС; С & ЕПРС; & ЕПРС; D & ЕПРС; & ЕПРС; A_bin & ЕПРС; & ЕПРС; B_bin & ЕПРС; & ЕПРС; C_bin & ЕПРС; & ЕПРС; D_bin

* 1 042 * 5 & ЕПРС; & ЕПРС; 6 & ЕПРС; & ЕПРС; 2 & ЕПРС; & ЕПРС; 6 & ЕПРС; & ЕПРС; & ЕПРС; 2 & ЕПРС; & ЕПРС; & ЕПРС; & ЕПРС; 2 & ЕПРС; & ЕПРС; & ЕПРС; & ЕПРС; 1 & ЕПРС; & ЕПРС; & ЕПРС; & ЕПРС; 2

8 & ЕПРС; & ЕПРС; 1 & ЕПРС; & ЕПРС; 6 & ЕПРС; & ЕПРС; 4 & ЕПРС; & ЕПРС; & ЕПРС; 1 & ЕПРС; & ЕПРС; & ЕПРС; & ЕПРС; 1 & ЕПРС; & ЕПРС; & ЕПРС; & ЕПРС; 2 & ЕПРС; & ЕПРС; & ЕПРС; & ЕПРС; 2 & ЕПРС; & ЕПРС; & ЕПРС; & ЕПРС; * 1 045 *

6 & ЕПРС; & ЕПРС; 7 & ЕПРС; & ЕПРС; 3 & ЕПРС; & ЕПРС; 1 & ЕПРС; & ЕПРС; & ЕПРС; 3 & ЕПРС; & ЕПРС; & ЕПРС; & ЕПРС; 2 & ЕПРС; & ЕПРС; & ЕПРС; & ЕПРС; 1 & ЕПРС; & ЕПРС; & ЕПРС; & ЕПРС; 1 & ЕПРС; & ЕПРС; & ЕПРС; & ЕПРС;

4 & ЕПРС; & ЕПРС; 9 & ЕПРС; & ЕПРС; 1 & ЕПРС; & ЕПРС; 9 & ЕПРС; & ЕПРС; & ЕПРС; 3 & ЕПРС; & ЕПРС; & ЕПРС; & ЕПРС; 3 & ЕПРС; & ЕПРС; & ЕПРС; & ЕПРС; 1 & ЕПРС; & ЕПРС; & ЕПРС; & ЕПРС; 3 & ЕПРС; & ЕПРС; & ЕПРС; & ЕПРС;

1 & ЕПРС; & ЕПРС; 3 & ЕПРС; & ЕПРС; 8 & ЕПРС; & ЕПРС; 7 & ЕПРС; & ЕПРС; & ЕПРС; 1 & ЕПРС; & ЕПРС; & ЕПРС; & ЕПРС; 1 & ЕПРС; & ЕПРС; & ЕПРС; & ЕПРС; 3 & ЕПРС; & ЕПРС; & ЕПРС; & ЕПРС; 3 & ЕПРС; & ЕПРС; & ЕПРС; & ЕПРС; * * тысяча пятьдесят-один

9 & ЕПРС; & ЕПРС; 2 & ЕПРС; & ЕПРС; 4 & ЕПРС; & ЕПРС; 8 & ЕПРС; & ЕПРС; & ЕПРС; 1 & ЕПРС; & ЕПРС; & ЕПРС; & ЕПРС; 1 & ЕПРС; & ЕПРС; & ЕПРС; & ЕПРС; 2 & ЕПРС; & ЕПРС; & ЕПРС; & ЕПРС; 3 & ЕПРС; & ЕПРС; & ЕПРС; & ЕПРС;

2 & ЕПРС; & ЕПРС; 5 & ​​ЕПРС; & ЕПРС; 9 & ЕПРС; & ЕПРС; 2 & ЕПРС; & ЕПРС; & ЕПРС; 2 & ЕПРС; & ЕПРС; & ЕПРС; & ЕПРС; 2 & ЕПРС; & ЕПРС; & ЕПРС; & ЕПРС; 3 & ЕПРС; & ЕПРС; & ЕПРС; & ЕПРС; 1

df_1 содержит только два столбца, df_2 имеет дополнительный столбец, который содержит ячейку, назначенную столбцам A и B в соответствии с диапазоном, в котором принадлежат, аналогично, df_3 содержит столбцы со значениями и дополнительный столбец с назначенным номером ячейки.

Я хочу извлечь строки из df_3 так, чтобы он извлекал данные только в тех случаях, когда столбцы df_2 имеют значение бина "2" для каждого столбца соответственно в отдельном фрейме данных.

Основная проблема, с которой я сталкиваюсь, это сделать БЕЗ упоминания имен столбцов в любом месте кода.

ожидаемый результат

df_output_1 (где значения столбца для столбца 'A' в df_2 равны 2)

* * А тысяча шестьдесят-восемь & ЕПРС; & ЕПРС; B & ЕПРС; & ЕПРС; С & ЕПРС; & ЕПРС; D & ЕПРС; & ЕПРС;

5 & EMSP; & EMSP; 6 & ЕПРС; & ЕПРС; 2 & ЕПРС; & ЕПРС; 6

* 1 072 * 2 & ЕПРС; & ЕПРС; 5 & ​​ЕПРС; & ЕПРС; 9 & ЕПРС; & ЕПРС; 2

df_output_2 (где значения столбца для столбца 'B' в df_2 равны 2)

* * А тысяча семьдесят шесть & ЕПРС; & ЕПРС; B & ЕПРС; & ЕПРС; С & ЕПРС; & ЕПРС; D & ЕПРС; & ЕПРС; * 1 077 *

5 & ЕПРС; & ЕПРС; 6 & ЕПРС; & ЕПРС; 2 & ЕПРС; & ЕПРС; 6

6 & ЕПРС; & ЕПРС; 7 & ЕПРС; & ЕПРС; 3 & ЕПРС; & ЕПРС; 1

2 & ЕПРС; & ЕПРС; 5 & ​​ЕПРС; & ЕПРС; 9 & ЕПРС; & ЕПРС; 2

Ответы [ 2 ]

0 голосов
/ 29 октября 2018

с помощью слияния (вправо или влево) мы можем отфильтровать славу данных.

    for bin_name in (column_name + "_bin" for column_name in df_1_columns):
      print(bin_name)
      df_3_joined = pd.merge(df_3[df_3_op_columns], df_2[df_2[bin_name] == 2][df_1_columns], how='right', on=df_1_columns, suffixes=['_l', ''])
      print(df_3_joined)

Полный пример:

import pandas as pd

df_1 = pd.DataFrame(columns = ['A', 'B'])
df_1.loc[len(df_1)] = [5,6]
df_1.loc[len(df_1)] = [8, 1]
df_1.loc[len(df_1)] = [6, 7]
df_1.loc[len(df_1)] = [4, 9]
df_1.loc[len(df_1)] = [1, 3]
df_1.loc[len(df_1)] = [9, 2]
df_1.loc[len(df_1)] = [2, 5]

df_2 = pd.DataFrame(columns = ['A', 'B', 'A_bin', 'B_bin'])
df_2.loc[len(df_2)] = [5, 6, 2, 2]
df_2.loc[len(df_2)] = [8, 1, 1, 1]
df_2.loc[len(df_2)] = [6, 7, 3, 2]
df_2.loc[len(df_2)] = [4, 9, 3, 3]
df_2.loc[len(df_2)] = [1, 3, 1, 1]
df_2.loc[len(df_2)] = [9, 2, 1, 1]
df_2.loc[len(df_2)] = [2, 5, 2, 2]

df_3 = pd.DataFrame(columns = ['A', 'B', 'C', 'D', 'A_bin', 'B_bin', 'C_bin', 'D_bin'])
df_3.loc[len(df_3)] = [5, 6, 2, 6, 2, 2, 1, 2]
df_3.loc[len(df_3)] = [8, 1, 6, 4, 1, 1, 2, 2]
df_3.loc[len(df_3)] = [6, 7, 3, 1, 3, 2, 1, 1]
df_3.loc[len(df_3)] = [4, 9, 1, 9, 3, 3, 1, 3]
df_3.loc[len(df_3)] = [1, 3, 8, 7, 1, 1, 3, 3]
df_3.loc[len(df_3)] = [9, 2, 4, 8, 1, 1, 2, 3]
df_3.loc[len(df_3)] = [2, 5, 9, 2, 2, 2, 3, 1]

results = {}
df_1_columns = list(df_1.columns)
df_3_op_columns = [cname for cname in list(df_3.columns) if not cname.endswith("_bin")]
for bin_name in (column_name + "_bin" for column_name in df_1_columns):
    df_3_joined = pd.merge(df_3[df_3_op_columns], df_2[df_2[bin_name] == 2][df_1_columns], how='right', on=df_1_columns)
    results[bin_name] = df_3_joined

for binName, result in results.iteritems():
    print(binName)
    print(result)

Если вы знаете имена бинов, то получите результат следующим образом.

A_bin_df = results['A_bin']
print(A_bin_df)
B_bin_df = results['B_bin']
print(B_bin_df)
0 голосов
/ 29 октября 2018

Используйте df.columns и индекс столбца, чтобы не использовать имена столбцов .

Вы можете использовать all_cols = df_2.columns, чтобы получить список имен столбцов. Затем используйте all_cols[i], чтобы получить имена столбцов.

Например, вы можете получить столбец B с помощью df_2[all_cols[1]] и получить столбец B_bin с помощью df_2[all_cols[1 + len(all_cols) / 2]]. Если вы хотите получить другой столбец и соответствующий ему столбец _bin, просто измените «1» на другой индекс столбца данных.

...