сопоставьте столбцы данных со значениями в списке и добавьте данные в соответствующие строки - PullRequest
1 голос
/ 21 апреля 2020

У меня есть два разных CSV, которые я читаю в двух кадрах данных. Я хочу сопоставить столбцы df1 ['building_type] с df2 [' model '] и добавить соответствующую строку в df1.

Фрейм данных 1:

data = [{'length': '34', 'width': '58.5', 'height': '60.2', 'building_type': ['concrete','wood','steel','laminate']},
       {'length': '42', 'width': '33', 'height': '23', 'building_type': ['concrete_double','wood_double','steel_double']}]
df1 = pd.DataFrame(data)

print(df1)

Фрейм данных 2:


data2 = [{'type': 'A1', 'floor': '2', 'model': ['wood','laminate','concrete','steel']},
       {'type': 'B3', 'floor': '4',  'model': ['wood_double','concrete_double','steel_double']}]
df2=pd.DataFrame(data2)
print(df2)

Конечный кадр данных:

   length   width   height  building_type                                 type  floor
0   34      58.5    60.2   [concrete, wood, steel, laminate]              A1    2
1   42      33      23     [concrete_double, wood_double, steel_double]   B3    4

1 Ответ

3 голосов
/ 21 апреля 2020

pd.merge кажется необходимым инструментом, но нам понадобится неизменный dtype. list изменчив и не может быть включен. Мы можем преобразовать list (изменяемые) в tuple или frozenset, которые являются неизменными и могут использоваться для присоединения. Так как пример вывода показывает, что порядок не имеет значения, я пошел с frozenset.

Вот код:

import pandas as pd

data = [{'length': '34', 'width': '58.5', 'height': '60.2', 'building_type': ['concrete','wood','steel','laminate']},
       {'length': '42', 'width': '33', 'height': '23', 'building_type': ['concrete_double','wood_double','steel_double']}]
df1 = pd.DataFrame(data)
print(df1)

data2 = [{'type': 'A1', 'floor': '2', 'model': ['wood','laminate','concrete','steel']},
       {'type': 'B3', 'floor': '4',  'model': ['wood_double','concrete_double','steel_double']}]
df2=pd.DataFrame(data2)
print(df2)


# Note: Merge fails on mutable dtype
# pd.merge(df1, df2, left_on='building_type', right_on='model')
# Produces `TypeError: unhashable type: 'list'`

# Convert mutable type to immutable type and merge.
# `tuple` is best if order matters for you. I am assuming that the
# order doesn't matter based on the sample output, so `frozenset` is more
# appropriate.
df1['building_type'] = df1['building_type'].apply(frozenset)
df2['model'] = df2['model'].apply(frozenset)

# Now, merge. Note that since column names are different both
# 'building_type' and 'model' would be retained. You can remove one of them.
final_df = pd.merge(df1, df2, left_on='building_type', right_on='model')
final_df = final_df.drop(['model'], axis=1)
print(final_df)

Вывод на моем компьютере:

  length width height                                 building_type
0     34  58.5   60.2             [concrete, wood, steel, laminate]
1     42    33     23  [concrete_double, wood_double, steel_double]
  type floor                                         model
0   A1     2             [wood, laminate, concrete, steel]
1   B3     4  [wood_double, concrete_double, steel_double]
  length width height                                 building_type type floor
0     34  58.5   60.2             (laminate, wood, steel, concrete)   A1     2
1     42    33     23  (concrete_double, steel_double, wood_double)   B3     4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...