Объединять / объединять DataFrames с разными индексами и разными именами столбцов

Использование вашего метода:

Вам не хватает инструкции цикла (Next i). Кроме того, вам не нужно использовать Replace, поскольку вы уже подтвердили значение в своей ячейке с помощью оператора If.

Если ваше значение равно From, вы можете просто изменить его на To непосредственно (& amp; наоборот)

Кроме того, это хорошая практика чтобы квалифицировать ваше использование объекта Cells.

Option Explicit

Sub To_From()

Dim ws As Worksheet, i as Long
Set ws = ThisWorkbook.Sheets("Template_Test")

For i = 2 To ws.Range("E" & ws.Rows.Count).End(xlUp).Row
    If ws.Cells(i, 5) = "From" Then
        ws.Cells(i, 5) = "To"
    ElseIF ws.Cells(i, 5) = "To" Then
        ws.Cells(i, 5) = "From"
    End If
Next i

End Sub

Более эффективный метод:

Избегайте делать это по строкам, сохраняя одно из ваших значений с временным значением (смените From на FromTemp ), чтобы избежать помех вашему другому свопу.

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

Option Explicit

Sub To_From()

Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("Template_Test")

Dim ReplaceRange As Range
Set ReplaceRange = ws.Range("E1:E" & ws.Range("E" & ws.Rows.Count).End(xlUp).Row)

ReplaceRange.Replace "From", "FromTemp", xlWhole
ReplaceRange.Replace "To", "From", xlWhole
ReplaceRange.Replace "FromTemp", "To", xlWhole

End Sub
4
задан d4rty 18 January 2019 в 20:30
поделиться

2 ответа

Я знаю, что W-B уже ответил на это очень элегантно.

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

От:

Я ищу способ вычислить следующее: С помощью индекса df я могу посмотреть в столбце A2 для df2 значение B2, которое должно быть добавлено в df.

Я понял, что должен сделать:

  1. получить форму списка индексов df. Итак, А, В, С ...
  2. посмотрите значения в df2 ['B2'] в том же индексе, что и df2 ['A2'] для каждого элемента индекса df
  3. , создайте новый столбец ['B2'] в df, куда мы копируем эти значения из df2 ['B2'], совпадающие с индексом из df для элементов в df2 ['A2']

Это мой код:

import pandas as pd

d = {'A': [1, 1, 0, 1, 0, 1, 0],
     'B': [0, 0, 0, 0, 0, 1, 1]
     }
df = pd.DataFrame(data=d, index=["A", "B", "C", "D", "E", "F", "G"])
print(df)

d = {'A2': ["D", "A", "A", "B", "C", "C", "E", "X", "F", "G"],
     'B2': ["DD", "AA", "AA", "BB", "CC", "CC", "EE", "XX", "FF", "GG"],
     'C3': [1, 1, 11, 35, 53, 2, 76, 45, 5, 34]}


df2 = pd.DataFrame(data=d)
print(df2)

llista=[]
for i in df.index:
    m=df2['A2'].loc[df2['A2']==i].index
    if m[0]:
        print m[0],i
        llista.append(df2['B2'].iloc[m[0]])
    else:
        llista.append([])
df['B2'] = llista

Вывод:

   A  B  B2
A  1  0  AA
B  1  0  BB
C  0  0  CC
D  1  0  []
E  0  0  EE
F  1  1  FF
G  0  1  GG

Как видите, отличается от принятого поста. Это потому, что в df2 нет индекса 'D' ['A2']

0
ответ дан daniel 18 January 2019 в 20:30
поделиться

set_index и назначить его

df['B2']=df2.drop_duplicates('A2').set_index('A2')['B2']
df
Out[728]: 
   A  B  B2
A  1  0  AA
B  1  0  BB
C  0  0  CC
D  1  0  DD
E  0  0  EE
F  1  1  FF
G  0  1  GG
0
ответ дан Wen-Ben 18 January 2019 в 20:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: