Python - меняйте значения в нескольких фреймах данных - PullRequest
0 голосов
/ 24 октября 2018

У меня есть DataFrame, подобный этому

id  val1   val2
0    A      B
1    B      B
2    A      A
3    A      A

И я хотел бы, чтобы значения подкачки были такими:

id  val1   val2
0    B      A
1    A      A
2    B      B
3    B      B

Мне нужно учитывать, что у df могут быть другие столбцы, которые я быхотел бы оставить без изменений.

Ответы [ 5 ]

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

Использование replace: почему здесь нужен C, отметьте this

df[['val1','val2']].replace({'A':'C','B':'A','C':'B'})
Out[263]: 
  val1 val2
0    B    A
1    A    A
2    B    B
3    B    B
0 голосов
/ 24 октября 2018

Вы можете эффективно поменять два значения, используя numpy.where.Однако, если больше , чем два значения, этот метод перестает работать.

a = df[['val1', 'val2']].values
df[['val1', 'val2']] = np.where(a=='A', 'B', 'A')

   id val1 val2
0   0    B    A
1   1    A    A
2   2    B    B
3   3    B    B

Для адаптации оставьте другие значения такими же, вы можете использовать np.select:

c1 = a=='A'
c2 = a=='B'
np.select([c1, c2], ['B', 'A'], a)
0 голосов
/ 24 октября 2018

Вы можете использовать pd.DataFrame.applymap со словарем:

d = {'B': 'A', 'A': 'B'}

df = df.applymap(d.get).fillna(df)

print(df)

  id val1 val2
0  0    B    A
1  1    A    A
2  2    B    B
3  3    B    B

Для производительности, в частности использования памяти, вы можете использовать категориальные данные :

for col in df.columns[1:]:
    df[col] = df[col].astype('category')
    df[col] = df[col].cat.rename_categories(d)
0 голосов
/ 24 октября 2018

Используйте factorize и бросьте соответствующие значения

def swaparoo(col):
  i, r = col.factorize()
  return pd.Series(r[(i + 1) % len(r)], col.index)

df[['id']].join(df[['val1', 'val2']].apply(swaparoo))

   id val1 val2
0   0    B    A
1   1    A    A
2   2    B    B
3   3    B    B

Альтернативная гимнастика с использованием той же функции.Это включает весь фрейм данных в факторизацию.

df.set_index('id').stack().pipe(swaparoo).unstack().reset_index()

Примеры

df = pd.DataFrame(dict(id=range(4), val1=[*'ABAA'], val2=[*'BBAA']))

print(
    df,
    df.set_index('id').stack().pipe(swaparoo).unstack().reset_index(),
    sep='\n\n'
)

   id val1 val2
0   0    A    B
1   1    B    B
2   2    A    A
3   3    A    A

   id val1 val2
0   0    B    A
1   1    A    A
2   2    B    B
3   3    B    B

df = pd.DataFrame(dict(id=range(4), val1=[*'AAAA'], val2=[*'BBBB']))

print(
    df,
    df.set_index('id').stack().pipe(swaparoo).unstack().reset_index(),
    sep='\n\n'
)

   id val1 val2
0   0    A    B
1   1    A    B
2   2    A    B
3   3    A    B

   id val1 val2
0   0    B    A
1   1    B    A
2   2    B    A
3   3    B    A

df = pd.DataFrame(dict(id=range(4), val1=[*'AAAA'], val2=[*'BBBB'], val3=[*'CCCC']))

print(
    df,
    df.set_index('id').stack().pipe(swaparoo).unstack().reset_index(),
    sep='\n\n'
)

   id val1 val2 val3
0   0    A    B    C
1   1    A    B    C
2   2    A    B    C
3   3    A    B    C

   id val1 val2 val3
0   0    B    C    A
1   1    B    C    A
2   2    B    C    A
3   3    B    C    A

df = pd.DataFrame(dict(id=range(4), val1=[*'ABCD'], val2=[*'BCDA'], val3=[*'CDAB']))

print(
    df,
    df.set_index('id').stack().pipe(swaparoo).unstack().reset_index(),
    sep='\n\n'
)

   id val1 val2 val3
0   0    A    B    C
1   1    B    C    D
2   2    C    D    A
3   3    D    A    B

   id val1 val2 val3
0   0    B    C    D
1   1    C    D    A
2   2    D    A    B
3   3    A    B    C
0 голосов
/ 24 октября 2018

Попробуйте stack ing, map ping, а затем unstack ing:

df[['val1', 'val2']] = (
    df[['val1', 'val2']].stack().map({'B': 'A', 'A': 'B'}).unstack())

df
   id val1 val2
0   0    B    A
1   1    A    A
2   2    B    B
3   3    B    B

Для (намного) более быстрого решения используйте понимание вложенного списка.

mapping = {'B': 'A', 'A': 'B'}
df[['val1', 'val2']] = [
    [mapping.get(x, x) for x in row] for row in df[['val1', 'val2']].values]

df
   id val1 val2
0   0    B    A
1   1    A    A
2   2    B    B
3   3    B    B
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...