Как добавить * или * обновить столбцы в панде DataFrame? - PullRequest
0 голосов
/ 13 ноября 2018

У меня есть существующий DataFrame и метод, который вычисляет несколько столбцов для добавления к этому DataFrame.В настоящее время я использую pd.concat([left, right], axis=1).Однако, когда я вызываю этот метод второй раз, он снова добавляет столбцы (с тем же именем).

Со следующими примерами фреймов данных left и right:

left = pd.DataFrame({'one': [1, 2, 3], 'two': [2, 3, 4]})
print(left)

   one  two
0    1    2
1    2    3
2    3    4

right = pd.DataFrame({'one': [22, 22, 22], 'NEW': [33, 33, 33]})
print(right)

   one  NEW
0   22   33
1   22   33
2   22   33

Я ищу foo метод, результат которого следующий:

left = left.foo(right)  # or foo(left, right)
print(left)

   one  two  NEW
0   22    2   33
1   22    3   33
2   22    4   33

И, что важно, если я вызову left.foo(right) второй раз, я хочу, чтобы результат не изменился.

pd.join выдает ошибку, когда столбец уже существует, pd.concat не перезаписывает существующие столбцы, pd.update только перезаписывает существующие столбцы, но не добавляет новые.

Есть лифункция / метод, чтобы делать то, что я хочу, или я должен написать сам?


Решение : Решение, которое сработало для меня, в сочетании с двумя ответами ниже,:

result = left.\
        drop(left.columns.intersection(right.columns), axis=1).\
        join(right)

Ответы [ 2 ]

0 голосов
/ 13 ноября 2018

Альтернативное решение, но оно только добавляет новые столбцы, а не перезаписывает:

left = pd.concat([left, right[right.columns.difference(left.columns)]], axis=1)

left = pd.concat([left, right[right.columns.difference(left.columns)]], axis=1)
print (left)
2   22   33
   one  two  NEW
0    1    2   33
1    2    3   33
2    3    4   33
0 голосов
/ 13 ноября 2018

Взять intersection и drop, затем столбцы merge на index:

left = left.drop(left.columns.intersection(right.columns),1).merge(right, left_index=True, right_index=True)

print(left)
   two  one  NEW
0    2   22   33
1    3   22   33
2    4   22   33
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...