заменить столбец в фрейме данных, вставив другой фрейм данных - PullRequest
2 голосов
/ 21 марта 2020

У меня есть два кадра данных df1 и df2:

data1 = {'A':[1,3,2,1.4,2,1,2,4], 'B':[10,30,20,1.4,2,78,2,78],'C':[200,340,20,180,2,201,2,100]}
df1 = pd.DataFrame(data1)
print(df1)

     A     B    C
0  1.0  10.0  200
1  3.0  30.0  340
2  2.0  20.0   20
3  1.4   1.4  180
4  2.0   2.0    2
5  1.0  78.0  201
6  2.0   2.0    2
7  4.0  78.0  100

data2 = {'D':['a1','a2','a3','a4',2,1,'a3',4], 'E':['b1','b2',20,1.4,2,78,2,78],'F':[200,340,'c1',180,2,'c2',2,100]}
df2 = pd.DataFrame(data2)
print(df2) 

    D    E    F
0  a1   b1  200
1  a2   b2  340
2  a3   20   c1
3  a4  1.4  180
4   2    2    2
5   1   78   c2
6  a3    2    2
7   4   78  100

Я хочу вставить df2 в df1, заменив столбец B в df1. Как вставить фрейм данных, повторно вставив столбец в другой фрейм данных.

желаемый результат:

     A   D    E    F    C
0  1.0  a1   b1  200  200
1  3.0  a2   b2  340  340
2  2.0  a3   20   c1   20
3  1.4  a4  1.4  180  180
4  2.0   2    2    2    2
5  1.0   1   78   c2  201
6  2.0  a3    2    2    2
7  4.0   4   78  100  100

Ответы [ 2 ]

1 голос
/ 21 марта 2020

Идея заключается в использовании concat с выбором столбцов по позициям на DataFrame.iloc и Index.get_loc, последний удалить исходный столбец на DataFrame.drop:

c = 'B'
pos = df1.columns.get_loc(c)

df = pd.concat([df1.iloc[:, :pos], df2, df1.iloc[:, pos:]], axis=1).drop(c, axis=1)
print (df)
     A   D    E    F    C
0  1.0  a1   b1  200  200
1  3.0  a2   b2  340  340
2  2.0  a3   20   c1   20
3  1.4  a4  1.4  180  180
4  2.0   2    2    2    2
5  1.0   1   78   c2  201
6  2.0  a3    2    2    2
7  4.0   4   78  100  100

Проверены другие столбцы:

c = 'A'
pos = df1.columns.get_loc(c)

df = pd.concat([df1.iloc[:, :pos], df2, df1.iloc[:, pos:]], axis=1).drop(c, axis=1)
print (df)
    D    E    F     B    C
0  a1   b1  200  10.0  200
1  a2   b2  340  30.0  340
2  a3   20   c1  20.0   20
3  a4  1.4  180   1.4  180
4   2    2    2   2.0    2
5   1   78   c2  78.0  201
6  a3    2    2   2.0    2
7   4   78  100  78.0  100

c = 'C'
pos = df1.columns.get_loc(c)

df = pd.concat([df1.iloc[:, :pos], df2, df1.iloc[:, pos:]], axis=1).drop(c, axis=1)
print (df)
     A     B   D    E    F
0  1.0  10.0  a1   b1  200
1  3.0  30.0  a2   b2  340
2  2.0  20.0  a3   20   c1
3  1.4   1.4  a4  1.4  180
4  2.0   2.0   2    2    2
5  1.0  78.0   1   78   c2
6  2.0   2.0  a3    2    2
7  4.0  78.0   4   78  100
0 голосов
/ 21 марта 2020

IIU C мы используем itertools с reindex

import itertools
l=list(itertools.chain.from_iterable(list(df2) if item == 'B' else [item] for item in list(df1)))

pd.concat([df1,df2], axis=1).reindex(columns=l)
     A   D    E    F    C
0  1.0  a1   b1  200  200
1  3.0  a2   b2  340  340
2  2.0  a3   20   c1   20
3  1.4  a4  1.4  180  180
4  2.0   2    2    2    2
5  1.0   1   78   c2  201
6  2.0  a3    2    2    2
7  4.0   4   78  100  100
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...