Python Pandas создает новый фрейм данных из всех комбинаций строк существующих фреймов данных - PullRequest
0 голосов
/ 21 марта 2019

У меня есть 2 входных кадра данных (df1 и df2), с идентичной структурой, и я хочу создать третий (output_df) со всеми комбинациями строк входных кадров данных.

df1 = pd.DataFrame([["John","18","a"],["Jane","19","b"],["Jim","20","c"]],columns=['Name','Age','Function'])
df2 = pd.DataFrame([["Don","21","d"],["Diana","22","e"],["Dave","23","f"]],columns=['Name','Age','Function'])

output_df=pd.DataFrame([["John_Don","18_21","a_d"],
["John_Diana","18_22","a_e"],
["John_Dave","18_23","a_f"],
["Jane_Don","19_21","b_d"],
["Jane_Diana","19_22","b_e"],
["Jane_Dave","19_23","b_f"],
["Jim_Don","20_21","c_d"],
["Jim_Diana","20_22","c_e"],
["Jim_Dave","20_23","c_f"]],columns=['Name','Age','Function'])

Новый кадр данных будет иметь сумму ("+") соответствующих столбцов исходного кадра данных. (Я знаю, что строки объединяются - это то, что мне нужно, если входные данные являются строками)

Приведенный ниже код создает output_df, но он пуст , а код занимает слишком много времени для запуска . Приведенный ниже пример кода работает только для записей 2х10 в качестве ввода Со временем я буду иметь дело с тысячами записей в качестве входных данных от каждого кадра данных.

Q1: что мне не хватает при заполнении выходного кадра данных?

Q2: как я могу сделать мой код более эффективным?

output_df=pandas.DataFrame(columns=['Name','Age','Function'])
i=0
for lendf1 in range (10):
    for lendf2 in range(10):
        output_df=output_df.append(pandas.Series(),ignore_index=True)
        i=i+1
        for column in output_df:
            output_df[column][i]=df1[column][lendf1:lendf1+1]+df2[column][lendf2:lendf2+1]

Ответы [ 2 ]

3 голосов
/ 21 марта 2019

Полагаю, вы ищете это:

first = pd.Series(['a', 'b', 'c', 'd', 'e'])
second = pd.Series(['f', 'g', 'h', 'i', 'j'])
pd.DataFrame(np.add.outer(first, second))

Вывод:

    0   1   2   3   4
0  af  ag  ah  ai  aj
1  bf  bg  bh  bi  bj
2  cf  cg  ch  ci  cj
3  df  dg  dh  di  dj
4  ef  eg  eh  ei  ej

Обратите внимание, что вход должен иметь тип pd.Series, а не фреймы данных.

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

Я думаю, что вы пытаетесь объединить оба столбца данных. Пожалуйста, попробуйте следующий код работает для вас.

import pandas as pd

df1 = pd.DataFrame([["John","18","a"],["Jane","19","b"],["Jim","20","c"]],columns=['Name','Age','Function'])
df2 = pd.DataFrame([["Don","21","d"],["Diana","22","e"],["Dave","23","f"]],columns=['Name','Age','Function'])

cols = list(df1)

out_list = []
for ind1, row1 in df1.iterrows():
    for ind2, row2 in df2.iterrows():
        in_list = []
        for i in range(0, len(cols)):
            in_list.append(row1[cols[i]] + '_' + row2[cols[i]])
        out_list.append(in_list)

outdf = pd.DataFrame(out_list, columns=cols)
print outdf
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...