Панды: Как заменить значения в фрейме данных, используя столбцы других фреймов данных - PullRequest
1 голос
/ 01 мая 2019

Я хочу заменить значения в фрейме данных A на «1», используя другой фрейм данных в качестве ссылки для его сопоставления, что-то вроде этого:

Исходный фрейм данных A:

Index  201901    201902    201903
a      0         0         0
b      0         0         0
c      0         0         0
d      0         0         0

кадр справочных данных B

Index  Month
a      201902
b      201901

Фрейм данных результата C

Index  201901    201902    201903
a      0         1         0
b      1         0         0
c      0         0         0
d      0         0         0

Я пробовал с loc, но не нашел способа заставить его работать. Есть предложения?

Ответы [ 3 ]

4 голосов
/ 01 мая 2019

Вы можете использовать df.iterrows() для итераций по строкам второго кадра данных и использовать df.at[] для установки значений, где вам нужно.

df = pd.DataFrame([[0,0,0], [0,0,0], [0,0,0], [0,0,0]], columns=['201901', '201902', '201903'])
df.index=['a', 'b','c', 'd']
print(df)
#    201901  201902  201903
# a       0       0       0
# b       0       0       0
# c       0       0       0
# d       0       0       0

dfb = pd.DataFrame(['201902', '201901'], columns=['month'])
dfb.index = ['a', 'b']
print(dfb)
#     month
# a  201902
# b  201901

for i, row in dfb.iterrows():
    df.at[i, row] = 1

print(df)
#    201901  201902  201903
# a       0       1       0
# b       1       0       0
# c       0       0       0
# d       0       0       0
2 голосов
/ 02 мая 2019

Numpy присвоить

df.values[df.index.get_indexer(dfb.index),df.columns.get_indexer(dfb.month)]=1
df
Out[1081]: 
   201901  201902  201903
a       0       1       0
b       1       0       0
c       0       0       0
d       0       0       0
2 голосов
/ 01 мая 2019

Похоже, нет необходимости повторять.У меня есть простое решение с использованием pd.get_dummies и pd.DataFrame.update

dfA.update(pd.get_dummies(dfB.Month.apply(str)))

Я использовал .apply(str), потому что содержимое dfB зарегистрировано как целое число, но столбцы из A являются строками, поэтому updateне будет работать, если поля не совпадают

Вывод:

       201901  201902  201903
Index                        
a         0.0     1.0       0
b         1.0     0.0       0
c         0.0     0.0       0
d         0.0     0.0       0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...