Изменение в одном столбце также должно привести к изменению в другом столбце

#python #python-3.x #dataframe

#python #python-3.x #фрейм данных

Вопрос:

У меня есть два столбца, скажем, A и B:

 A     B
A12   A14
A13   A22
B54   A43
B43   B52
A43   B52
A43   B53
  

и так далее.

Когда я пытаюсь изменить A, записи в B остаются неизменными, они не меняются в соответствии с A. Когда я пытаюсь упорядочить A в зависимости от их появления, B не соответствует одному и тому же. Он остается в той же позиции.
Вот результат, который я получаю:

      A     B
   A43   A14
   A43   A22
   A12   A43
   A13   B52
   B54   B52 #no change occurs
   B43   B53 #no change occurs
  

Ожидаемый результат будет примерно таким:

      A     B
    A43   B52   #Change in A should make change in B as well. 
    A43   B53   #values in B should get affected due to changes in A
    A12   A14
    A13   A22
    B54   A43
    B43   B52
  

Поскольку A43 повторяется дважды, оно должно быть первым.
Я использую этот код, но изменение применяется только к A, а не к B.

 import pandas as pd
y= M['A']= M['A'].astype(str)
i= M['B']= M['B'].astype(str)
e= y[y!='nan']
z= i[i!= 'nan']
f= (list(chain.from_iterable(repeat(i, c) for i,c in Counter(e).most_common())))
j= [''.join(x) for x in zip(e, z)]
print(f)    
  

Любая помощь будет высоко оценена.

Комментарии:

1. Пожалуйста, попробуйте объяснить логику того, что вы пытаетесь сделать вместо этого

2. Спасибо за ответ. Я выбрал A и B, удалил значения ‘nan’, а затем расположил A с наиболее повторяющимся значением вверху. Я заархивировал A с помощью B, чтобы оно менялось по мере изменения A. Я даже пробовал переставлять значения после архивирования, но это все равно дает мне тот же результат.

Ответ №1:

Чтобы изменить второй столбец, вам нужно в какой-то момент получить индекс строки, которая должна быть изменена. Я действительно не знаю библиотеку pandas, но я могу дать вам решение :

 import pandas as pd
import collections

M = pd.DataFrame({'A': ['A12', 'A13', 'B54', 'B43', 'A43', 'A43'], 'B': ['A14', 'A22', 'A43', 'B52', 'B52', 'B53']}

output = pd.DataFrame(columns=['A', 'B'])

for i, c in collections.Counter(e).most_common():
    lines = M.loc[M['A']==i].index.values   # returns line indices
    for line in lines:
        output.loc[len(output)] = M.iloc[line]
  

И результатом является:

 In [74]: output
Out[74]:
     A    B
0  A43  B52
1  A43  B53
2  A12  A14
3  A13  A22
4  B54  A43
5  B43  B52
  

Комментарии:

1. Спасибо за ответ! И у меня это сработало. Большое спасибо.