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

У меня есть два кадра данных df1 и df2,

df1

A B
2 6
5 1
7 3
1 2
9 7
4 7
3 4
8 9

и df2 содержит

A  B  A_bin  B_bin  C  D  E
2  6  1      2      5  4  1
5  1  2      1      2  2  4
7  3  3      1      5  1  7
1  2  1      1      8  4  9
9  7  3      3      5  5  8
4  7  2      3      1  8  5
3  4  1      2      2  9  3
8  9  3      3      4  6  2

Я пытаюсь выбрать только те конкретные строки, которые выбраны из df2 для нового фрейма данных df_result_A для всех строк, которые имеют A_bin = 1 аналогично, отдельный фрейм данных df_result_B, имеющий все эти строки df2, такие что B_bin строк содержат 1. Мне трудно поставить неверный синтаксис моей логики, или, возможно, моя логика неверна,

for i in range(len(df1(df2[columns])+len(df)):
    if(row value is 1)
print in df_result_A
print in df_result_B

Поскольку задача состоит в том, чтобы не использовать имя столбца и индексирование, поскольку код должен выполняться и для другого набора данных Я пытаюсь сначала выполнить итерацию по первым двум столбцам df2, так как len(df1) будет дайте мне знать, что после 2 столбцов A_bin и B_bin придут. таким образом, когда я нахожусь в первом столбце df2, то добавление len(df1) поставит меня на A_bin и итерирует по нему, чтобы проверить значение равным 1 и сохранить его в отдельном кадре данных. Точно так же, когда я нахожусь во 2-м столбце df2, добавление len(df2) поставит меня на B_bin и, таким образом, сохранит его результат в df_result_B. ожидаемый результат в отдельном кадре данных.

df_result_A

A  B   C  D  E
2  6   5  4  1
1  2   8  4  9
3  4   2  9  3

df_result_b

A B C D E
5 1 2 2 4
7 3 5 1 7
1 2 8 4 9

1 Ответ

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

Вы можете сделать что-то вроде этого:

Примерные кадры данных:

In [31]: df1
Out[31]: 
   A  B
0  2  6
1  5  1
2  7  3
3  1  2
4  9  7
5  4  7
6  3  4
7  8  9

In [36]: df2
Out[36]: 
   A  B  A_bin  B_bin  C  D  E
0  2  6      1      2  5  4  1
1  5  1      2      1  2  2  4
2  7  3      3      1  5  1  7
3  1  2      1      1  8  4  9
4  9  7      3      3  5  5  8
5  4  7      2      3  1  8  5
6  3  4      1      2  2  9  3
7  8  9      3      3  4  6  2

Имеет переменную count и пустой словарь для хранения новых фреймов данных на лету.

count = 0
d = dict()

Я использовал вашу логику, чтобы выбрать каждый 3-й столбец на основе длины столбцов df1.

for col in df2.columns:
    print(col)
    l = df1.shape[1]
    if count < l:
        d[col] = df2[ df2.iloc[:, count + l] == 1 ]
    count += 1

Это перебирает столбцы df2 до тех пор, пока переменная count не станет меньше, чем число столбцов df1. Он фильтрует строки 3-го и 4-го столбцов (согласно вашему примеру) со значением 1 и сохраняет в словаре d.

Теперь вы можете перебирать свой словарь и находить новые нужные вам фреймы данных:

In [52]: for key in d.keys():
    ...:     print(d[key][d[key].columns.drop(list(d[key].filter(regex='bin')))])

   A  B  C  D  E
0  2  6  5  4  1
3  1  2  8  4  9
6  3  4  2  9  3


   A  B  C  D  E
1  5  1  2  2  4
2  7  3  5  1  7
3  1  2  8  4  9

Итак, вам не нужно беспокоиться о точных именах столбцов. Дайте мне знать, если это поможет.

...