Создать набор данных из двух разных наборов данных - PullRequest
3 голосов
/ 10 июня 2019

У меня есть два разных набора данных:

1. state    VDM MDM OM
      AP    1   2   5
     GOA    1   2   1
      GU    1   2   4
      KA    1   5   1

2. Attribute:Value     Support     Item
             VDM:1     4           1
             VDM:2     0           2
             VDM:3     0           3
             VDM:4     0           4
             VDM:5     0           5
             MDM:1     0           6
             MDM:2     3           7
             MDM:3     0           8
             MDM:4     0           9
             MDM:5     1           10
              OM:1     2           11
              OM:2     0           12
              OM:3     0           13
              OM:4     1           14
              OM:5     1           15

Первый набор данных содержит только 1-5 значений. Второй набор данных содержит пару Атрибут: Значение, его вхождения и порядковый номер (Элемент).

Я хочу набор данных, который выглядит следующим образом:

state      Item Number
   AP      1, 7, 15
  GOA      1, 7, 11
   GU      1, 7, 14
   KA      1, 10, 11

Ответы [ 3 ]

5 голосов
/ 10 июня 2019

Ничто из этого мне не нравится.Но иногда вам просто нужно получить доступ к вашим данным.

Попытка # 0

a = dict(zip(df2['Attribute:Value'], df2['Item']))
cols = ['VDM', 'MDM', 'OM']
b = {
    'Item Number':
    [', '.join([str(a[f'{c}:{t._asdict()[c]}']) for c in cols]) for t in df1.itertuples()]
}

df1[['state']].assign(**b)

  state Item Number
0    AP    1, 7, 15
1   GOA    1, 7, 11
2    GU    1, 7, 14
3    KA   1, 10, 11

Попытка # 1

a = dict(zip(df2['Attribute:Value'], df2['Item'].astype(str)))
d1 = df1.set_index('state').astype(str)
r1 = (d1.columns + ':' + d1).replace(a)  # Thanks @anky_91
# r1 = (d1.columns + ':' + d1).applymap(a.get)
r1

      VDM MDM  OM
state            
AP      1   7  15
GOA     1   7  11
GU      1   7  14
KA      1  10  11

Тогда

pd.DataFrame({'state': r1.index, 'Item Number': [*map(', '.join, zip(*map(r1.get, r1)))]})

  state Item Number
0    AP    1, 7, 15
1   GOA    1, 7, 11
2    GU    1, 7, 14
3    KA   1, 10, 11

Попытка # 2

a = dict(zip(df2['Attribute:Value'], df2['Item'].astype(str)))
cols = ['VDM', 'MDM', 'OM']
b = {
    'Item Number':
    [*map(', '.join, zip(*[[a[f'{c}:{i}'] for i in df1[c]] for c in cols]))]
}

df1[['state']].assign(**b)

  state Item Number
0    AP    1, 7, 15
1   GOA    1, 7, 11
2    GU    1, 7, 14
3    KA   1, 10, 11

Попытка # 3

from itertools import cycle

a = dict(zip(zip(*df2['Attribute:Value'].str.split(':').str), df2['Item'].astype(str)))
d = df1.set_index('state')
b = {
    'Item Number':
    [*map(', '.join, zip(*[map(a.get, zip(cycle(d), np.ravel(d).astype(str)))] * 3))]
}

df1[['state']].assign(**b)

  state Item Number
0    AP    1, 7, 15
1   GOA    1, 7, 11
2    GU    1, 7, 14
3    KA   1, 10, 11

Попытка # 4

a = pd.Series(dict(zip(
    zip(*df2['Attribute:Value'].str.split(':').str),
    df2.Item.astype(str)
)))

df1.set_index('state').stack().astype(str).groupby(level=0).apply(
    lambda s: ', '.join(map(a.get, s.xs(s.name).items()))
).reset_index(name='Item Number')

  state Item Number
0    AP    1, 7, 15
1   GOA    1, 7, 11
2    GU    1, 7, 14
3    KA   1, 10, 11
3 голосов
/ 10 июня 2019

Я чувствую, что это merge и pivot проблема

s=df2['Attribute:Value'].str.split(':',expand=True).assign(Item=df2.Item)
s[1]=s[1].astype(int)
s1=df1.melt('state')


s1.merge(s,right_on=[0,1],left_on=['variable','value']).pivot('state','variable','Item')
Out[113]: 
variable  MDM  OM  VDM
state                 
AP          7  15    1
GOA         7  11    1
GU          7  14    1
KA         10  11    1
3 голосов
/ 10 июня 2019

Вот еще один подход, использующий stack, map и unstack:

s = df.set_index('state').stack()
s_map = df2.set_index(['Attribute:Value'])['Item']
s.loc[:] = (s.index.get_level_values(1) + ':' + s.astype(str)).map(s_map)
s.unstack().astype(str).apply(', '.join, axis=1).reset_index(name='Item Number')

[выход]

  state Item Number
0    AP    1, 7, 15
1   GOA    1, 7, 11
2    GU    1, 7, 14
3    KA   1, 10, 11
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...