Объединить данные с повторяющейся строкой с Python - PullRequest
1 голос
/ 19 марта 2019

Я обнаружил проблему при попытке преобразовать код SAS в python. Предположим, у меня есть 2 кадра данных, которые можно увидеть ниже:

df = pd.DataFrame({"monthkey": [1, 2, 3, 4, 5]})
df2 = pd.DataFrame({"name": ['foo','foo','bar']})

Я хочу, чтобы таблица выглядела так:

monthkey name
1        foo 
2        foo 
3        foo  
4        foo  
5        foo  
1        bar  
2        bar  
3        bar  
4        bar  
5        bar  

Я написал код SAS ниже для справки, но как я могу использовать python для создания результата?

proc sql;
create table want as select a.*,b.*from
df as a left join df2 as b on a.monthkey;
quit;

Есть предложения по этому поводу? Спасибо.

Ответы [ 3 ]

0 голосов
/ 19 марта 2019

Вы также пытаетесь использовать from_product в pd.MultiIndex:

pd.DataFrame(index = pd.MultiIndex.from_product([df2['name'].drop_duplicates(),df['monthkey']])).reset_index()

Выход:

  level_0  level_1
0     foo        1
1     foo        2
2     foo        3
3     foo        4
4     foo        5
5     bar        1
6     bar        2
7     bar        3
8     bar        4
9     bar        5
0 голосов
/ 19 марта 2019
df = pd.DataFrame({'monthkey': (list(range(1, 6)) * 2),
                   'name': ['foo' for i in range(1, 6)] + 
                           ['bar' for i in range(6, 11)]})

Использование диапазонов для построения одного DataFrame сделало его более простым. Документация по структуре данных Python содержит информацию об этом методе.

output:

monthkey name
       1  foo
       2  foo
       3  foo
       4  foo
       5  foo
       1  bar
       2  bar
       3  bar
       4  bar
       5  bar
0 голосов
/ 19 марта 2019

Вы можете попробовать ниже

df.assign(foo=1).merge(df2.drop_duplicates().assign(foo=1) ).drop('foo', 1)
...