Как я могу найти строки в кадре данных pandas, где значение col1 для row_x == значение col2 для row_y? - PullRequest
1 голос
/ 03 октября 2019

У меня есть пандас с несколькими столбцами. 2 из этих столбцов должны быть одинаковыми, но в отдельных строках, а третий столбец должен быть одинаковым в обеих строках.

Например, для заданного кадра данных df [A, B, C] найдите row_x и row_y, такие что:

(df.iloc[x, A] == df.iloc[y, B]) and (df.iloc[x, B] == df.iloc[y, A]) and (df.iloc[x, C] == df.iloc[y, C])

Есть ли лучший способ, чем перебирать фрейм для получения строк со столбцами с перестановкой?

A = [30,31]+list(range(2,8,1))+[38,39]
B = range(10,0,-1)
C = [True, False, True, False, False, False, True, False, True, False]

df = pd.DataFrame({'A': A, 'B': B, 'C': C})

Out[]: df
    A   B   C
0   30  10  True
1   31  9   False
2   2   8   True
3   3   7   False
4   4   6   False
5   5   5   False
6   6   4   True
7   7   3   False
8   38  2   True
9   39  1   False


Required output:
    A   B   C
3   3   7   False
5   5   5   False
7   7   3   False

Только строки 3, 5 и 7удовлетворить вышеуказанные условия. Далее я удалю строку 5, так как меня не интересуют строки со столбцом A = столбец B. Обратите внимание, что строки 4 и 6 также имели поменяемые значения в столбцах A и B, но другое значение в столбце C.

Ответы [ 2 ]

2 голосов
/ 03 октября 2019

Используйте GroupBy для группировки по столбцу C .Используйте GroupBy.apply и Series.isin , чтобы проверить общие значения обеих серий(A и B), затем вы можете использовать DataFrame.unstack с DataFrame.any для выполнения логического индексирования :

new_df=df[df.groupby('C').apply(lambda x: x['A'].isin(x['B'])&x['B'].isin(x['A'])).unstack().any()]
print(new_df)


   A  B      C
3  3  7  False
5  5  5  False
7  7  3  False

В ответ на ваш комментарий:

df['A'].isin(df['B'])

0    False
1    False
2     True
3     True
4     True
5     True
6     True
7     True
8    False
9    False
Name: A, dtype: bool

df['A']==df['B']        

0    False
1    False
2    False
3    False
4    False
5     True
6    False
7    False
8    False
9    False
dtype: bool
1 голос
/ 03 октября 2019

Ключ заключается в том, чтобы объединить фрейм данных, сопоставив столбец B со столбцом A:

df = df.merge(df.rename({'B': 'A', 'A': 'AfromB', 'C': 'CfromB'}, axis=1), how='left')
df = df[(df['B'] == df['AfromB']) & (df['C'] == df['CfromB'])].drop(['AfromB', 'CfromB'], axis=1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...